这是我的测试代码:
#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,但我无法弄清楚原因。
答案 0 :(得分:12)
有一些关于结构中对齐的事实值得一提:
因此,由于其中一个成员的对齐方式为4096,因此结构本身的对齐方式至少为4096.很可能就是这样。
但是因为它需要在c
之前填充4080字节,所以结构的大小至少为4104,但它必须是4096的多个,它的对齐。所以它增长到8192。
答案 1 :(得分:4)
这是因为sizeof
告诉我们放置数组中的下一个元素的位置。那就是你有声明
struct A a[2];
您需要将a[0].c
和a[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);
之间的填充(也是)。