gcc 中用户定义部分的对齐
alignment in user defined sections in gcc
似乎 gcc 中针对 x86 的顶级对象 >= 32 字节自动获得 32 字节对齐。这可能对性能有好处,但我正在从用户定义的部分中的所有目标文件中收集一组东西,额外的对齐间隙对该数组造成严重破坏。有什么办法可以防止这个对象对齐吗?
澄清一下,我有一个低对齐结构,不同的目标文件定义
用户定义部分中该结构数组形式的数据,其中
使一个应用程序范围广泛的目的。
一旦其中一个数组 >= 32,对象对齐和部分对齐就会被推到 32,当链接器将目标文件中的单独部分连接到可执行文件中时,它会在模块边界处创建对齐填充符那个部分。
以下程序说明了一个可能的解决方案,假定 GCC
您可以接受的扩展名:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ALIGNMENT // __attribute__ ((aligned (8)))
struct A {
char arr[40];
} ;
struct A a __attribute__ ((section ("my_data"))) ALIGNMENT = {{'a'}};
struct A b __attribute__ ((section ("my_data"))) ALIGNMENT = {{'b'}};
struct A c __attribute__ ((section ("my_data"))) ALIGNMENT = {{'c'}};
int main(int argc, char **argv)
{
assert(sizeof(struct A) == 40);
printf("%c\n",a.arr[0]);
printf("%c\n",b.arr[0]);
printf("%c\n",c.arr[0]);
printf("%lu\n",(unsigned long)(&a));
printf("%lu\n",(unsigned long)(&b));
printf("%lu\n",(unsigned long)(&c));
return 0;
}
我的输出是:
a
b
c
6295616
6295680
6295744
请注意,在我的(64 位)可执行文件中,三个 40 字节结构中的每一个
是 64 字节对齐的。
现在取消注释 // __attribute__ ((aligned (8)))
,重建并重新运行。我的
那么输出是:
a
b
c
6295616
6295656
6295696
现在结构是 8 字节对齐的,没有间隙。
似乎 gcc 中针对 x86 的顶级对象 >= 32 字节自动获得 32 字节对齐。这可能对性能有好处,但我正在从用户定义的部分中的所有目标文件中收集一组东西,额外的对齐间隙对该数组造成严重破坏。有什么办法可以防止这个对象对齐吗?
澄清一下,我有一个低对齐结构,不同的目标文件定义 用户定义部分中该结构数组形式的数据,其中 使一个应用程序范围广泛的目的。 一旦其中一个数组 >= 32,对象对齐和部分对齐就会被推到 32,当链接器将目标文件中的单独部分连接到可执行文件中时,它会在模块边界处创建对齐填充符那个部分。
以下程序说明了一个可能的解决方案,假定 GCC 您可以接受的扩展名:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ALIGNMENT // __attribute__ ((aligned (8)))
struct A {
char arr[40];
} ;
struct A a __attribute__ ((section ("my_data"))) ALIGNMENT = {{'a'}};
struct A b __attribute__ ((section ("my_data"))) ALIGNMENT = {{'b'}};
struct A c __attribute__ ((section ("my_data"))) ALIGNMENT = {{'c'}};
int main(int argc, char **argv)
{
assert(sizeof(struct A) == 40);
printf("%c\n",a.arr[0]);
printf("%c\n",b.arr[0]);
printf("%c\n",c.arr[0]);
printf("%lu\n",(unsigned long)(&a));
printf("%lu\n",(unsigned long)(&b));
printf("%lu\n",(unsigned long)(&c));
return 0;
}
我的输出是:
a
b
c
6295616
6295680
6295744
请注意,在我的(64 位)可执行文件中,三个 40 字节结构中的每一个 是 64 字节对齐的。
现在取消注释 // __attribute__ ((aligned (8)))
,重建并重新运行。我的
那么输出是:
a
b
c
6295616
6295656
6295696
现在结构是 8 字节对齐的,没有间隙。