首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用__attribute__aligned()或alignas()对齐对象数组?

使用__attribute__aligned()或alignas()对齐对象数组?
EN

Stack Overflow用户
提问于 2012-08-19 12:46:09
回答 2查看 1.2K关注 0票数 4

快速问答伙计们。这些代码旋转体是否具有相同的对齐方式?

代码语言:javascript
复制
struct sse_t {
     float sse_data[4];
};

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

代码语言:javascript
复制
// 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];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-19 13:12:26

这些代码旋转体是否具有相同的对齐方式?

不完全是。你的两个例子实际上是非常不同的。

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

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

代码语言:javascript
复制
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;
}

输出:

代码语言:javascript
复制
16
64

我非常确定第二种情况是,而不是你想要的

票数 6
EN

Stack Overflow用户

发布于 2013-11-17 00:26:45

但是为什么要对齐到64个字节呢?http://ideone.com/JNEIBR

代码语言:javascript
复制
#include <iostream>
using namespace std;

struct sse_t1 {
     float sse_data[4];
};

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

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

struct sse_t2 cacheline2[1000000];

int main() {
    cout << "sizeof(sse_t1) = " << sizeof(sse_t1) << endl;
    cout << "sizeof(sse_t2) = " << sizeof(sse_t2) << endl;  

    cout << "array cacheline1 " << (((size_t)(cacheline1) % 64 == 0)?"aligned to 64":"not aligned to 64") << endl;
    cout << "array cacheline2 " << (((size_t)(cacheline2) % 64 == 0)?"aligned to 64":"not aligned to 64") << endl;    

    cout << "cacheline1[0] - cacheline1[1] = " << (size_t)&(cacheline1[1]) - (size_t)&(cacheline1[0]) << endl;
    cout << "cacheline2[0] - cacheline2[1] = " << (size_t)&(cacheline2[1]) - (size_t)&(cacheline2[0]) << endl;  

    return 0;
}

输出:

代码语言:javascript
复制
sizeof(sse_t1) = 16
sizeof(sse_t2) = 64
array cacheline1 aligned to 64
array cacheline2 aligned to 64
cacheline1[0] - cacheline1[1] = 16
cacheline2[0] - cacheline2[1] = 64
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12024286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档