如何将堆栈变量与16byte边界对齐

时间:2013-03-16 19:46:26

标签: c alignment callstack

我有以下局部变量(将存储在堆栈中)。

struct test1 {
  int a;
  int b;
  char c;
};

如何将整数a的起始地址与堆栈中的16byte边界对齐?

我在自定义编写的MIPS ISA处理器上运行此C代码。

3 个答案:

答案 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 longdouble,它们只有8个字节。