我有以下局部变量(将存储在堆栈中)。
struct test1 {
int a;
int b;
char c;
};
如何将整数的起始地址与堆栈中a
的16byte
边界对齐?
我在自定义编写的 MIPS ISA 处理器上运行此 C 代码。
这是对齐数据的一些非标准方法。
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);
}
不幸的是,没有标准的方法可以让对象像这样对齐。几乎总是有一些特定于编译器的技巧,例如__attribute__
在 GCC 中,但您必须检查编译器的文档。
(当然,这种对齐方式也没有标准用途,这就是为什么没有实现它的标准方法的原因。所以你可能已经在诉诸扩展,所以进一步没有真正的伤害。)
包含足够大的元素对象的联合通常可以解决问题,但我相信 MIPS CPU 的最大元素 C 对象是long long
and double
,它们只有 8 个字节。
在这种情况下,在 MIPS ISA C 编译器上的 AFAIK 强制对齐字边界,只需在结构中添加一个 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
};