我知道根据C标准,不允许执行未对齐的内存读取,因为它可能会导致SIGBUS
。
尽管如此,我已经看到一些机器,这不是问题。
如何知道从我的机器上的未对齐内存中读取是否安全?更具体地说,我使用的是亚马逊Linux。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Stepping: 3
CPU MHz: 800.000
BogoMIPS: 7981.41
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7
答案 0 :(得分:4)
重点是,在大多数情况下,未对齐的访问权限是undefined behavior(如果您声称代码是可移植的,符合标准的C或C ++代码)。
未定义的行为始终是very bad ,并且它有一些令人不快的属性,有时它看起来似乎有效(因此有一些程序显然无法正常工作;它可能会在下次破坏)。
实际上,在接受未对齐访问的当前机器上(可能是许多x86_64处理器),这样的访问非常慢因为它们使CPU cache不满意(需要两次内存读取)硬件水平)。另请参阅this。
只需避免未对齐访问(以及其他形式的UB,包括buffer overflows)。尝试编写标准代码,并遵循常规实践和智慧。启用编译器中的所有警告,并尝试不能获得单个警告。有关更多建议,请再次查看this link。
答案 1 :(得分:2)
它会"工作"在你描述的环境中? "是",(性能损失。)
安全吗?如果你蒙着眼睛穿过一条繁忙的街道并安全地到达另一边,那是不是很安全"?