c++ - 为什么在我的实现中所有数组都对齐到 16 个字节?
问题描述
我非常简单的代码如下所示
#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;
}
这段代码的输出是
对齐(array_char):1
对齐(array_float):4
array_char 的地址:0x7fff5e8ec580
array_float 的地址:0x7fff5e8ec570
operator的结果alignof
在预期中,但两个数组的真实地址并不一致。无论我尝试了多少次,地址始终是 16 字节对齐的。
我在带有 Intel CORE i5 第 7 代 CPU 的 Ubuntu 16.04 上使用 gcc 5.4.0。
解决方案
我找到了这个补丁。
这似乎是 GCC 6.4 中修复的 x86_64 的错误。
System V x86-64 ABI 要求聚合类型(例如数组和struct
s)如果至少 16 字节大,则至少要对齐到 16 字节。根据 ABI 规范中的注释,这是为了方便 SSE 指令的使用。
GCC 似乎错误地将该规则应用于大小为 16 位(而不是字节)和更大的聚合。
我建议您将编译器升级到更新的 GCC 版本。
然而,这只是一个优化问题,而不是正确性问题。对变量进行更严格的对齐并没有错,并且(与提到的 SSE 一样)过度对齐在某些情况下可能具有性能优势,超过了浪费堆栈内存的成本。
推荐阅读
- discord - How can I check Emojis simultaneously in discord.py re-write?
- python - 在具有特定路径的 lxml 树中查找元素
- nginx - 在 Nginx 中显示 PDF 的不同来源
- python - 每次调用对象时更新实例变量
- mongodb - mongoDB aggregate mergeObjects
- asp.net-core - IdentityServer 授权用户 SubId
- python - 当我们运行层次聚类算法时,有没有办法为数据框分配标签?
- ios - 将 CoreLocation 坐标转换为 PDF 地图
- r - 有没有办法告诉 R 我在连接中引用的文件是 csv2?
- python - 如何向 seaborn FacetGrid 添加额外的图并指定颜色