假设填充已启用的结构大小

时间:2016-10-23 04:01:19

标签: c padding

假设我的结构定义如下:

int positive = 0;
int negative = 0;
int count = 0;
int total = 0;
int average;


Random r = new Random();
int number = 0;


 while (count > 20) {
    number = r.nextInt(200);
    total += number;
    count++;
    if (number > 0) {
        positive++;
    } 
    else if (number < 0) {
        negative++;
    }
}
average = (double) total / count;
System.out.println("The number of positives is " + positive + " ");
System.out.println("The number of negatives is " + negative + " ");
System.out.printf("The average is: " + average);

现在根据填充规则,字符变量可以从任何地址开始,因为它只有一个字节,而intger变量应该从一个可被4整除的地址开始,而short变量应该从任何偶数地址开始。  在这种情况下,如果我们假设字符变量从OFFSET 0开始。

 typedef struct
 {
   char a;
   int b;
   char c;
 }abc_t;

这里结构的总大小将变为12。

但我怀疑的是,结构的第一个元素是否是一个&#39; char?&#39;这里从偏移量1开始,然后根据填充规则,我们在a之后只有2个字节填充,因此结构的大小将是8个字节。

struct
{
    char a; // OFFSET 0+3 bytes padding
    int b;  // OFFSET 4
    char c; //OFFSET 5+3 bytes padding
}abc_t;

任何以短变量开头的结构变量都是如此。 如果我对此的理解是正确的,或者我们可以安全地假设任何结构的第一个成员总是从一个可被4整除的地址开始,你能告诉我吗?

提前多多感谢。

1 个答案:

答案 0 :(得分:-1)

这里有一些问题:

1)int的大小不需要4个字节,它的sizeof(int)是编译器定义的。根据字长,可以是4字节,8字节甚至2字节。请参阅Is the size of C "int" 2 bytes or 4 bytes?

2)结构中的字段对齐取决于编译器。您放置字段的顺序并不能保证更紧密的包装。但是,保留了字段的顺序。请参阅Why isn't sizeof for a struct equal to the sum of sizeof of each member?

3)将较短的结构放在一起通常会导致更紧密的包装。

4)结构从字边界开始。在第一个字段之前从不存在任何填充。所以,是的,地址将在一个单词的开头。 Why use address of first element of struct, rather than struct itself?

希望这有帮助。