我在代码中定义了许多数据数组,其长度仅在数组初始值设定项中指定。
int a[] = {1, 2, 3, 4};
int b[] = {1, 2, 3, 4, 5};
出于缓存行一致性考虑,我想将它们填充到缓存行大小(32)。可以使用以下代码,而不会泄露确切的尺寸信息
struct {
int payload[4];
} __attribute__((aligned(32))) a = {
.payload = {1, 2, 3, 4}
};
struct {
int payload[5];
} __attribute__((aligned(32))) b = {
.payload = {1, 2, 3, 4, 5}
};
// sizeof(a.packet) = 4, sizeof(b.packet) = 5
但是这样的数据相当多,手动去一一重写是很困难的。有没有办法定义一个宏来处理这个问题,比如
#define ARRAY_INITIALIZER (array, initializer) ...
#define ARRAY_PAYLOAD(array) array.payload
ARRAY_INITIALIZER(a, {1, 2, 3, 4});
ARRAY_INITIALIZER(b, {1, 2, 3, 4, 5});
这里最困难的是如何计算初始化器的长度,没有得到任何指导,有人可以帮忙吗?
此初始化会生成 C 或 C++ 中的对齐地址:
__attribute__((aligned(32))) int a[] = {1, 2, 3, 4} ;
__attribute__((aligned(32))) int b[] = {1, 2, 3, 4, 5};
宏是微不足道的。