c++ - 为什么在我的实现中所有数组都对齐到 16 字节?

标签 c++ memory-alignment

我的非常简单的代码如下所示

#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

address of array_char: 0x7fff5e8ec580

address of array_float: 0x7fff5e8ec570

alignof运算符的结果符合预期,但两个数组的实际地址与它们不一致。无论我尝试多少次,地址始终是 16 字节对齐的。

我在 Ubuntu 16.04 上使用 gcc 5.4.0,采用 Intel CORE i5 第 7 代 CPU。

最佳答案

我找到了this补丁。

这似乎是 GCC 6.4 中修复的 x86_64 的错误。

System V x86-64 ABI 要求聚合类型(例如数组和结构体)至少与 16 字节对齐(如果它们的大小至少为 16 字节)。根据 ABI 规范中的注释,这是为了方便 SSE 指令的使用。

GCC 似乎错误地将该规则应用于 16 位(而不是字节)及更大大小的聚合。

我建议您将编译器升级到更新的 GCC 版本。

<小时/>

但这只是一个优化问题,而不是正确性问题。对变量进行更严格的对齐并没有什么问题,并且(与提到的 SSE 一样)过度对齐在某些情况下可能会带来性能优势,甚至超过浪费堆栈内存的成本。

关于c++ - 为什么在我的实现中所有数组都对齐到 16 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59074271/

相关文章:

c++ - 将 char 数组(或一些字节)视为结构对象。它是如何工作的?

c - 在 OS X 上使用 -m32 编译 union 的冗余大小

c++ - 将 fork() 与 boost::asio::ip::tcp::iostream 一起使用是否安全?

c++ - 处理从十六进制到十六进制的转换

具有可变文件名的 C++ ifstream

c - 在单字节数组中对齐混合字符串和整数数据的方法有哪些?

c++ - 缓存行对齐(需要在文章中说明)

c++ - 对齐的结构/类对象的填充字节中存储哪些值

c++ - 使用 Windows API 和 WM_KEYDOWN C++ 时按键输入滞后

c++ - 使用模板函数和普通函数生成的代码之间的区别