3

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

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

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

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

4

3 回答 3

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);
}
于 2013-03-16T19:50:50.653 回答
1

不幸的是,没有标准的方法可以让对象像这样对齐。几乎总是有一些特定于编译器的技巧,例如__attribute__在 GCC 中,但您必须检查编译器的文档。

(当然,这种对齐方式也没有标准用途,这就是为什么没有实现它的标准方法的原因。所以你可能已经在诉诸扩展,所以进一步没有真正的伤害。)

包含足够大的元素对象的联合通常可以解决问题,但我相信 MIPS CPU 的最大元素 C 对象是long longand double,它们只有 8 个字节。

于 2013-03-16T20:13:57.077 回答
1

在这种情况下,在 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

};
于 2013-03-16T19:51:04.563 回答