sizeof(),C结构中的对齐方式:
前言:
我的研究结构对齐.看了 this问题,this一个和 this一个 – 但仍然没有找到我的答案. 我的实际问题: 这是我创建的代码片段,以澄清我的问题: #include "stdafx.h" #include <stdio.h> struct IntAndCharStruct { int a; char b; }; struct IntAndDoubleStruct { int a; double d; }; struct IntFloatAndDoubleStruct { int a; float c; double d; }; int main() { printf("Int: %dn",sizeof(int)); printf("Float: %dn",sizeof(float)); printf("Char: %dn",sizeof(char)); printf("Double: %dn",sizeof(double)); printf("IntAndCharStruct: %dn",sizeof(IntAndCharStruct)); printf("IntAndDoubleStruct: %dn",sizeof(IntAndDoubleStruct)); printf("IntFloatAndDoubleStruct: %dn",sizeof(IntFloatAndDoubleStruct)); getchar(); } 它的输出是: Int: 4 Float: 4 Char: 1 Double: 8 IntAndCharStruct: 8 IntAndDoubleStruct: 16 IntFloatAndDoubleStruct: 16 我在IntAndCharStruct和IntAndDoubleStruct中看到了对齐. 但我只是没有获得IntFloatAndDoubleStruct. 简单地说:为什么sizeof(IntFloatAndDoubleStruct)= 24? 提前致谢! p.s:我正在使用Visual-Studio 2017标准控制台应用程序. 编辑: 解决方法
你的结构必须是8 * N字节长,因为它有一个8字节(双)的成员.这意味着结构位于存储器中的地址(A)可被8整除(A%8 == 0),其结束地址将是(A 8N),也可以被8整除.
从那里,您存储2个4字节变量(int float),这意味着您现在占用内存区域[A,A 8].现在存储一个8字节的变量(双精度).因为(A 8)%8 == 0 [因为A%8 == 0],所以不需要填充.因此,没有填充,你得到4 4 8 == 16. 如果您将订单更改为int – >双 – >浮动你将占用24个字节,因为双变量原始地址不能被8整除,并且它必须填充4个字节才能到达有效地址(并且结构在末尾也会有填充). |--------||--------||--------||--------||--------||--------||--------||--------| | each || cell || here ||represen||-ts 4 || bytes || || | |--------||--------||--------||--------||--------||--------||--------||--------| A A+4 A+8 A+12 A+16 A+20 A+24 [addresses] |--------||--------||--------||--------||--------||--------||--------||--------| | int || float || double || double || || || || | [content - basic case] |--------||--------||--------||--------||--------||--------||--------||--------| first padding to ensure the double sits on address that is divisble by 8 last padding to ensure the struct size is divisble by the largest member's size (8) |--------||--------||--------||--------||--------||--------||--------||--------| | int || padding|| double || double || float || padding|| || | [content - change order case] |--------||--------||--------||--------||--------||--------||--------||--------| (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |