在struct中使用__attribute __((aligned())),为什么sizeof的结果是这样的?

时间:2016-07-26 09:31:06

标签: c memory-management

这是我的测试代码:

#include <cstdio>
struct A {
    int  a;
    int  b;
    int  c __attribute__((aligned(4096)));
    int  d;
}t;
int main()
{
    printf("%d\n",sizeof(t));

    return  0;
}

结果是8192,但我无法弄清楚原因。

2 个答案:

答案 0 :(得分:12)

有一些关于结构中对齐的事实值得一提:

  1. 类型的大小始终是其对齐的倍数。
  2. 结构的对齐始终是其所有成员对齐的倍数。
  3. 因此,由于其中一个成员的对齐方式为4096,因此结构本身的对齐方式至少为4096.很可能就是这样。

    但是因为它需要在c之前填充4080字节,所以结构的大小至少为4104,但它必须是4096的多个,它的对齐。所以它增长到8192。

答案 1 :(得分:4)

这是因为sizeof告诉我们放置数组中的下一个元素的位置。那就是你有声明

struct A a[2];

您需要将a[0].ca[1].c都对齐4096个字节。

严格来说,编译器可以设法以4096的大小来实现这一点,但这可能不是因为struct A将继承对齐要求并在之前放置两个int .c字段也必须对齐,在4080.b之间插入.c填充字节,然后4080填充.d后填充字节N*4096 1}}。

编译器可以完成此操作的方式(不重新排列struct成员)是扩展对齐的概念。它不是仅仅要求地址必须落在N*4096-2*sizeof(int)形式的地址上,而是可以通过偏移来扩展它,要求它落在struct A形式的地址上。给.c这样的要求会导致4096元素自然地成为.b字节对齐,而不需要.c<?php $array = array( 'order_num' => 1400236903, 'status' => 'unpaid', 'payment_rec_date' => '2014-05-16', 'description' => '', 'actual_amount' => 200 , 'stax' => 20.00, 'stax_value' =>30.00 , 'ed_tax' => 31.21, 'ed_tax_value' => 30.00, 'w_ed_tax' => 25.00, 'w_ed_tax_value' => 55.56 , 'amount' => 12000, 'total_discount' => 152 ); $newArray = array(); $data = new stdClass(); foreach($array as $key => $value) { switch ($key){ case 'order_num': case 'status': case 'payment_rec_date': case 'description': case 'description': $newArray[$key] = $value; break; default: $data->$key = $value; } } $newArray['data'] = json_encode($data); print_r($newArray); 之间的填充(也是)。