- 主题:reinterpret_cast<uint *>(void *) 碰到未对齐内存会出错吗?
这个标准有没有规定?
直接 (int *) 强转会不会出错?
--
FROM 124.72.119.*
会
【 在 hgoldfish 的大作中提到: 】
: 这个标准有没有规定?
: 直接 (int *) 强转会不会出错?
:
--
FROM 73.63.209.*
那怎么搞定??
uint loaduint(const char *sr) {
uint t;
memcpy(&t, src, sizeof(t));
return t;
}
这样可行不?
【 在 allegro (静水流深) 的大作中提到: 】
: 会
--
FROM 124.72.119.*
我一直这么用,网卡、usb、pcie收到的数据转float*、double*、__m256*直接用没报错
【 在 allegro 的大作中提到: 】
: 会
--
FROM 123.150.181.*
单纯的cast肯定不会报错,只是deref时可能触发系统异常。也就是语言或者编译器无要求,只是硬件/os的要求。
x86是没问题的(只是默认情况下。有寄存器开关的),随便align。
windows下只有kerner driver或者少数的API对于传入的mem有align要求。API的align要求一般也是下层的kernel driver或者硬件引起的。不过这个传参的align和deref的align有差异。
SEM_NOALIGNMENTFAULTEXCEPT
https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-seterrormode
ARM老版本之类的可能有问题
https://stackoverflow.com/questions/32062894/take-advantage-of-arm-unaligned-memory-access-while-writing-clean-c-code
已经式微/消失的SPARC也有align要求
https://docs.oracle.com/cd/E23824_01/html/819-3196/hwovr-1.html
【 在 Akyrum 的大作中提到: 】
: 我一直这么用,网卡、usb、pcie收到的数据转float*、double*、__m256*直接用没报错
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
m128、m256之类的,用simd指令的话,如果不对齐会出问题
其他类型x86上应该没问题
【 在 Akyrum 的大作中提到: 】
: 我一直这么用,网卡、usb、pcie收到的数据转float*、double*、__m256*直接用没报错
--
FROM 123.112.21.*
编译器会有警告,我一般用memcpy,性能好像没什么区别
--
FROM 27.186.192.*
咱能用C++吗?
【 在 hgoldfish 的大作中提到: 】
: 这个标准有没有规定?
: 直接 (int *) 强转会不会出错?
:
--
FROM 76.126.252.*
【 在 z16166 的大作中提到: 】
: 单纯的cast肯定不会报错,只是deref时可能触发系统异常。也就是语言或者编译器无要求,只是硬件/os的要求。
: x86是没问题的(只是默认情况下。有寄存器开关的),随便align。
: windows下只有kerner driver或者少数的API对于传入的mem有align要求。API的align要求一般也是下层的kernel driver或者硬件引起的。不过这个传参的align和deref的align有差异。
: ...................
别的不知道,x86前两天刚试过,是这样的
--
FROM 112.65.12.*
手册能查到。x86(包括x64)的对齐检查通过下面三个东西控制是否启用:
1、CR0寄存器的AM位(Alignment mask)。ring 0才能修改这个位。要测试必须写个kernel module。
2、EFLAGS寄存器的AC位(Alignment check)。ring 3就能修改这个位。
3、当前处于ring 3。
linux和windows对此的处理也可能不一样。windows允许通过SetErrorMode()选择是否让os把对齐异常抛给app自己处理。
【 在 stub 的大作中提到: 】
: 别的不知道,x86前两天刚试过,是这样的
--
FROM 114.241.227.*