【发布时间】:2013-03-05 10:29:29
【问题描述】:
我有以下局部变量(将存储在堆栈中)。
struct test1 {
int a;
int b;
char c;
};
如何将整数a 的起始地址与堆栈中的16byte 边界对齐?
我在自定义编写的 MIPS ISA 处理器上运行此 C 代码。
【问题讨论】:
我有以下局部变量(将存储在堆栈中)。
struct test1 {
int a;
int b;
char c;
};
如何将整数a 的起始地址与堆栈中的16byte 边界对齐?
我在自定义编写的 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);
}
【讨论】:
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
};
【讨论】:
不幸的是,没有标准方法可以让对象像这样对齐。几乎总是有一些特定于编译器的技巧,例如 GCC 中的__attribute__,但您必须检查编译器的文档。
(当然,这种对齐方式也没有标准的使用,这就是为什么没有实现它的标准方法的原因。所以你可能已经在求助于扩展,所以没有真正的伤害更进一步。)
包含足够大的元素对象的联合通常可以解决问题,但我相信 MIPS CPU 的最大元素 C 对象是 long long 和 double,它们只有 8 个字节。
【讨论】: