我有一个本地变量(将存储在堆栈中),内容如下:
struct test1 {
int a;
int b;
char c;
};
如何将整数变量a
的起始地址对齐到栈上的16字节
边界?
我在自定义的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);
}
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
};
很不幸,没有一种 标准 方法可以使对象对齐。几乎总会有一些编译器特定的技巧,例如在GCC中使用__attribute__
,但您需要查看编译器的文档。
(当然,这种对齐方式也没有标准的用途,这就是为什么没有标准方法来实现它的原因。所以你可能已经在使用扩展功能了,那么再进一步也没有什么实际的危害。)
包含足够大的基本对象的联合通常可以解决问题,但我相信MIPS CPU的最大基本C对象是long long
和double
,它们只有8个字节。