如何将全局变量放置相邻? (无需在链接描述文件中设置)
how to place global variables placed adjacent? (without setting it at linker script)
我想将3个变量彼此相邻放置32个字节。这是为了调试,一个可疑的行为。
对于这行C代码(sparc,裸机,在函数外定义一个全局变量。)
int __attribute__ ((aligned (32))) xx0, layer_complete, xx1;
仅使用这段代码,变量 xx0、xx1、layer_complete 对齐到 32 字节,但在 layer_complete 之后放置了一些变量。我只想将一个变量放在 32 位范围内。 (话虽如此,我有使用union的想法。但是我很好奇如果没有union我是否可以做到)。
ADD :我用 union 试过这个(在 layer_complete 之后做一些 space)
union ttt {
int layer_complete;
int a[8]; // to make it 32 bytes
} __attribute__((aligned(32))) lc_union;
#define layer_complete lc_union.layer_complete
检查program.map我可以看到layer_complete是32字节对齐的,后面的28字节没有使用(当然)。
这应该可以解决问题:
typedef struct
{
int _Alignas(32) xx0;
int _Alignas(32) layer_complete;
int _Alignas(32) xx1;
} thing;
...
thing t;
如果您出于某种原因使用的是非常旧的 gcc 版本(C11 之前的版本,4.x 或更早的版本),那么您也可以使用非标准的 __attribute__ ((aligned (32)))
.
由于这只是为了调试目的,您可以制作 #define xx0 t.xx0
等宏,使结构与您已有的结构兼容。
类似的东西:
char memVar96[96];
void *ptr1 = memVar96;
void *ptr2 = &memVar96[32];
void *ptr3 = &memVar96[64];
#define var1 (*(MyVarType1*)ptr1)
#define var2 (*(MyVarType2*)ptr2)
#define var3 (*(MyVarType3*)ptr3)
我想将3个变量彼此相邻放置32个字节。这是为了调试,一个可疑的行为。
对于这行C代码(sparc,裸机,在函数外定义一个全局变量。)
int __attribute__ ((aligned (32))) xx0, layer_complete, xx1;
仅使用这段代码,变量 xx0、xx1、layer_complete 对齐到 32 字节,但在 layer_complete 之后放置了一些变量。我只想将一个变量放在 32 位范围内。 (话虽如此,我有使用union的想法。但是我很好奇如果没有union我是否可以做到)。
ADD :我用 union 试过这个(在 layer_complete 之后做一些 space)
union ttt {
int layer_complete;
int a[8]; // to make it 32 bytes
} __attribute__((aligned(32))) lc_union;
#define layer_complete lc_union.layer_complete
检查program.map我可以看到layer_complete是32字节对齐的,后面的28字节没有使用(当然)。
这应该可以解决问题:
typedef struct
{
int _Alignas(32) xx0;
int _Alignas(32) layer_complete;
int _Alignas(32) xx1;
} thing;
...
thing t;
如果您出于某种原因使用的是非常旧的 gcc 版本(C11 之前的版本,4.x 或更早的版本),那么您也可以使用非标准的 __attribute__ ((aligned (32)))
.
由于这只是为了调试目的,您可以制作 #define xx0 t.xx0
等宏,使结构与您已有的结构兼容。
类似的东西:
char memVar96[96];
void *ptr1 = memVar96;
void *ptr2 = &memVar96[32];
void *ptr3 = &memVar96[64];
#define var1 (*(MyVarType1*)ptr1)
#define var2 (*(MyVarType2*)ptr2)
#define var3 (*(MyVarType3*)ptr3)