簡體   English   中英

如何將全局變量相鄰放置? (沒有在 linker 腳本中設置它)

[英]how to place global variables placed adjacent? (without setting it at linker script)

我想將 3 個變量彼此相鄰放置 32 個字節。 這是為了調試,一個可疑的行為。
對於這行 C 代碼(sparc,bare-metal,在 function 之外定義一個全局變量。)

int __attribute__ ((aligned (32))) xx0, layer_complete, xx1;

僅使用此代碼,變量 xx0、xx1、layer_complete 對齊到 32 字節,但就在 layer_complete 之后,放置了一些變量。 我只想將一個變量放置在 32 位范圍內。 (話雖如此,我有一個使用聯合的想法。但我很好奇我是否可以在沒有聯合的情況下做到這一點)。

添加:我用聯合嘗試了這個(在 layer_complete 之后騰出一些空間)

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM