【发布时间】:2020-03-23 05:59:50
【问题描述】:
我的非常简单的代码如下所示
#include <iostream>
#include <stdalign.h>
int main() {
char array_char[2] = {'a', 'b'};
float array_float[2] = {1, 2};
std::cout << "alignof(array_char): " << alignof(array_char) << std::endl;
std::cout << "alignof(array_float): " << alignof(array_float) << std::endl;
std::cout << "address of array_char: " << (void *) array_char << std::endl;
std::cout << "address of array_float: " << array_float << std::endl;
}
这段代码的输出是
alignof(array_char): 1
alignof(array_float): 4
array_char的地址:0x7fff5e8ec580
array_float的地址:0x7fff5e8ec570
alignof运算符的结果在预期中,但是两个数组的真实地址并不一致。不管我试了多少次,地址总是 16 字节对齐的。
我在带有 Intel CORE i5 第 7 代 CPU 的 Ubuntu 16.04 上使用 gcc 5.4.0。
【问题讨论】:
-
"两个数组的真实地址和它们不一致" 是的。仅仅因为某些内容恰好与 16 字节边界对齐并不意味着它也不会与 2 或 1 字节边界对齐。
-
没有 16 字节对齐 here
-
@Jarod42 根据我的 Godbolt 测试,似乎 gcc 将它们对齐到 16 个字节,直到 gcc 6.3。 (那里有 gcc 9.2。)
-
编译器可能正在设置 16 字节对齐,以便它可以(可能)对您的数据使用 SSE 指令进行某些操作。
标签: c++ memory-alignment