0 c linux amazon-ec2 memory-alignment
我知道根据 C 标准,不允许执行未对齐的内存读取,因为它可能会导致SIGBUS.
不过,我见过一些机器,这不是问题。
我如何知道从计算机上未对齐的内存中读取数据是否安全?更具体地说,我正在使用 Amazon 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
Run Code Online (Sandbox Code Playgroud)
关键是,在大多数情况下,未对齐的访问是未定义的行为(如果您声称编写了可移植且符合标准的 C 或 C++ 代码)。
未定义的行为总是非常糟糕,并且它具有令人不快的属性,有时它似乎可以工作(因此,某些程序显然可以工作并不能说明任何问题;它下次可能会崩溃)。
实际上,在当前接受未对齐访问的机器上(可能是许多 x86_64 处理器),此类访问非常慢,因为它们使CPU 缓存不满意(需要在硬件级别进行两次内存读取)。另请参阅此。
因此,只需避免未对齐的访问(以及其他形式的 UB,包括缓冲区溢出)。尝试按照标准进行编码,并遵循常见的实践和智慧。启用编译器中的所有警告,并尽量不要收到任何警告。再次查看此链接以获取更多建议。