我有以下局部变量(将存储在堆栈中)。
struct test1 {
int a;
int b;
char c;
};
如何将整数a
的起始地址与堆栈中的16byte
边界对齐?
我在自定义编写的MIPS ISA处理器上运行此C代码。
答案 0 :(得分:2)
以下是一些对齐数据的非标准方式。
struct test1 *pdata;
// here we assume data on stack is word aligned
pdata = alloca(sizeof(*pdata) + 14);
if (pdata & 0xF)
{
pdata = (unsigned char*)pdata + 16 - (pdata & 0xF);
}
答案 1 :(得分:1)
AFAIK On MIPS ISA C编译器在这种情况下被强制对齐字边界,只需在结构中添加一个int(32位)。这样:
struct test1 {
int a; // 4 bytes
int b; // 4 bytes
int foralign;// 4 bytes for 16 byte alignment
char c; // 1 byte but will be aligned 4 bytes
};
答案 2 :(得分:1)
不幸的是,没有标准方法来让对象像那样对齐。几乎总是有一些特定于编译器的技巧,例如GCC中的__attribute__
,但你必须检查编译器的文档。
(当然也没有标准的使用进行这种对齐,这就是为什么没有标准方法来实现它。所以你可能已经采用扩展,所以没有真正的伤害更进一步。)
包含足够大的元素对象的联合通常可以解决问题,但我相信MIPS CPU的最大元素C对象是long long
和double
,它们只有8个字节。