如何将栈变量对齐到16字节边界

3
我有一个本地变量(将存储在堆栈中),内容如下:
struct test1 {
  int a;
  int b;
  char c;
};

如何将整数变量a的起始地址对齐到栈上的16字节边界?

我在自定义的MIPS ISA处理器上运行这段C代码。


请参见https://dev59.com/JnRA5IYBdhLWcg3wvgsb。 - Valeri Atamaniouk
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);
}

1
应该是 alloca(sizeof(*pdata) + 15); 对吧? - Antony Riakiotakis

1
据我所知,在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

};

从技术上讲,它只是增加了大小,但并没有变成16字节对齐。 - Valeri Atamaniouk
@Valeri 如果编译器字对齐功能打开的话,它将增长到16字节...没错。如果我说错了,请告诉我,我会删除我的回答。我也不喜欢SO上不必要的答案堆积...提前感谢您。 - Volkan

1

很不幸,没有一种 标准 方法可以使对象对齐。几乎总会有一些编译器特定的技巧,例如在GCC中使用__attribute__,但您需要查看编译器的文档。

(当然,这种对齐方式也没有标准的用途,这就是为什么没有标准方法来实现它的原因。所以你可能已经在使用扩展功能了,那么再进一步也没有什么实际的危害。)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接