我如何知道从计算机上未对齐的内存地址读取是否安全?

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)

Bas*_*tch 5

关键是,在大多数情况下,未对齐的访问是未定义的行为(如果您声称编写了可移植且符合标准的 C 或 C++ 代码)。

未定义的行为总是非常糟糕,并且它具有令人不快的属性,有时它似乎可以工作(因此,某些程序显然可以工作并不能说明任何问题;它下次可能会崩溃)。

实际上,在当前接受未对齐访问的机器上(可能是许多 x86_64 处理器),此类访问非常,因为它们使CPU 缓存不满意(需要在硬件级别进行两次内存读取)。另请参阅

因此,只需避免未对齐的访问(以及其他形式的 UB,包括缓冲区溢出)。尝试按照标准进行编码,并遵循常见的实践和智慧。启用编译器中的所有警告,并尽量不要收到任何警告。再次查看此链接以获取更多建议。