C 数组填充

问题描述 投票:0回答:1

我在代码中定义了许多数据数组,其长度仅在数组初始值设定项中指定。

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});

这里最困难的是如何计算初始化器的长度,没有得到任何指导,有人可以帮忙吗?

arrays c macros initializer
1个回答
0
投票

此初始化会生成 C 或 C++ 中的对齐地址:

__attribute__((aligned(32))) int a[] = {1, 2, 3, 4} ;
__attribute__((aligned(32))) int b[] = {1, 2, 3, 4, 5};

宏是微不足道的。

© www.soinside.com 2019 - 2024. All rights reserved.