【问题标题】:How to align stack variable to 16byte boundary [duplicate]如何将堆栈变量对齐到 16 字节边界 [重复]
【发布时间】:2013-03-05 10:29:29
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c alignment callstack


【解决方案1】:

这是对齐数据的一些非标准方法。

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);
}

【讨论】:

  • 应该是 alloca(sizeof(*pdata) + 15);没有?
【解决方案2】:

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

};

【讨论】:

  • 从技术上讲,它只是增加了大小,但不会变成 16 字节对齐。
  • @Valeri 如果打开编译器字对齐,它将增长到 16 个字节......是的。如果我错了,请通知我,所以我会删除我的答案。我也不喜欢 SO 中不必要的答案堆......提前致谢。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2020-03-26
    • 2011-08-24
    • 2013-05-18
    • 2021-01-28
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多