c++ - 对象数组对齐用__attribute__aligned() 还是alignas()?

标签 c++ caching compiler-optimization memory-alignment

快速提问,伙计们...这些代码 spines 是否具有相同的对齐方式?

struct sse_t {
     float sse_data[4];
};

// the array "cacheline" will be aligned to 64-byte boundary
struct sse_t alignas(64) cacheline[1000000];

或者

// every object of type sse_t will be aligned to 64-byte boundary
struct sse_t {
     float sse_data[4];
} __attribute((aligned(64)));

struct sse_t cacheline[1000000];

最佳答案

Are these code spinets have the same alignment ?

不完全是。您的两个示例实际上非常不同。

在您的第一个示例中,您将获得一组 sse_t 对象。 sse_t 对象仅保证 4 字节对齐。但是由于整个数组对齐到 64 字节,每个 sse_t 对象都将正确对齐以进行 SSE 访问。

在您的第二个示例中,您强制每个 sse_t 对象对齐到 64 字节。但是每个 sse_t 对象只有 16 个字节。所以阵列将大 4 倍。 (您将在每个 sse_t 对象的末尾有 48 个字节的填充)。


struct objA {
     float sse_data[4];
};
struct objB {
     float sse_data[4];
} __attribute((aligned(64)));

int main(){
    cout << sizeof(objA) << endl;
    cout << sizeof(objB) << endl;
}

输出:

16
64

我很确定第二种情况不是您想要的。

关于c++ - 对象数组对齐用__attribute__aligned() 还是alignas()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024286/

相关文章:

c++ - 初始化对象时丢弃placement new返回值是否可以

c++ - 在对象列表上使用迭代器时遇到问题

c++ - 通过非常量引用参数修改常量引用参数

c# - 优化一个非常大的两级深度迭代

c++ - 私有(private)继承和交换

macos - 清除 CoreBluetooth GATT 缓存而不删除绑定(bind)

java - 为什么 Oracle Java 编译器更喜欢无参数 StringBuilder 构造函数?

php - 在使用 imagecache_create_path & getimagesize 之前使用 Drupal imagecache 生成图像

mysql - Laravel 数据库缓存

c - GCC SSE代码优化