【发布时间】:2020-08-04 11:10:02
【问题描述】:
我有一个问题,最好用例子来解释。请考虑以下代码:
unsigned char a,
b;
这显然定义了两个unsigned char类型的变量。
如果我想让变量与 16 字节边界对齐,我的第一个天真的方法是这样的:
__attribute__((aligned(16))) unsigned char a,
b;
我的问题是我不确定编译器是否总是将__attribute__((aligned(16))) 应用于这两个变量。
我特别担心,因为以下所有代码在编译时都没有错误或警告:
unsigned char a __attribute__((aligned(16)));
unsigned char __attribute__((aligned(16))) b;
__attribute__((aligned(16))) unsigned char c;
根据我的研究,__attribute__((aligned(16))) 对上面三行中的相应变量执行相同的操作。但是这么弱的语法对于 C 来说是不寻常的,所以我有点不信任。
回到我原来的问题,我知道我可以很容易地避免不确定性,比如
__attribute__((aligned(16))) unsigned char a;
__attribute__((aligned(16))) unsigned char b;
或许
unsigned char a __attribute__((aligned(16))),
b __attribute__((aligned(16)));
但我真的很想知道在声明 all 应该具有属性的多个变量时添加__attribute__ 装饰一次 是否足够。
当然,这个问题涉及所有属性(不仅仅是aligned 属性)。
作为一个额外的问题,将这些属性不仅添加到变量定义中,还添加到变量声明中(例如在头文件中)是否被认为是一种好的样式?
【问题讨论】:
-
最好每行声明一个变量
-
这个问题在这里得到解答:stackoverflow.com/a/31067623/5639126
-
@secretsquirrel 我认为这个答案是错误的(通过解释 gcc 文档和使用 gcc 10 对其进行测试)
-
@secretsquirrel 我也做了额外的研究并确认 ensc 是正确的。但是,他的回答仅引用了说明属性在何种情况下适用于特定声明对象的段落,而不是声明中的所有对象,因此这可能仍然令人担忧。解决方案在他链接的文档中:GNU 文档确实说明了该属性在何种情况下适用于整个声明,即声明中的所有声明对象。不过,相应的句子很难找到。
-
@secretsquirrel 如果我会在相应的引文中写一个额外的答案是否合适?
标签: c gcc gcc-attribute