导航:首页 > 编程语言 > struct编程尺寸是多少

struct编程尺寸是多少

发布时间:2022-05-21 07:25:46

Ⅰ 大神看一下这个struct的大小,为什么

struct aaa{
char a;
short b;
int c;
char d;
short e;
char f;
}cc;

先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。
实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。

第一个成员a的偏移量为0。第二个成员b的偏移量是第一个成员的偏移量加上第一个成员的大小(0+1),其值为1;并不是自身(short)大小的整数倍,因此补上1个空字节。
第三个成员c的偏移量是(2+2),是自身(int)大小的整数倍,第四个成员d的偏移量为(4+4),是自身(char)大小的整数倍,第五个成员e的偏移量为(8+1),并不是自身(short)大小的整数倍,因此补上1个空字节。第五个成员f的偏移量为(10+2),是自身(char)大小的整数倍。所以最后大小为13,但是13不是成员中最大int的整数倍,系统需要增加到16。因此最终是16

Ⅱ C++中结构体的大小

结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体.
struct
{
char a;
short b;
char c;
}S1;
struct
{
char a;
char b;
short c;
}S2;
分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4
可见,虽然两个结构体所含的元素相同,但因为其中存放的元素类型顺序不一样,所占字节也出现差异。这就是字节对齐原因。通过字节对齐,有助于加快计算机的取数速度,否则就得多花指令周期。
字节对齐原则
结构体默认的字节对齐一般满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset,即每个成员的起始地址)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
注意:当结构体成员里面有数组成员时,如int a[10],要看成10个整形变量才参与计算。

通过这三个原则,就不难理解上面两个struct的差异了.
对于struct S1, 为了使short变量满足字节对其准则(2), 即其存储位置相对于结构体首地址的offset是自身大小(short占2个字节)的整数倍,必须在字节a后面填充一个字节以对齐;再由准则(3),为了 满足结构体总大小为short大小的整数倍,必须再在c后面填充一个字节。

对于struct S2, 却不必如上所述的填充字节,因为其直接顺序存储已经满足了对齐准则。
如果将上面两个结构体中的short都改为int(占4个字节), 那么会怎么样呢? 程序得出sizeof(S1)=12, sizeof(S2)=8
利用上面的准则,也不难计算得出这样的结果。S1中在a后面填充3个字节、在c后面填充3个字节,这样一共12个字节;S2中在a、b顺序存储之后填充两个字节用以对其,这样一共就8个字节。
当然,在某些时候也可以设置字节对齐方式。这就需要使用 #pragma pack 。
#pragma pack(push) //压栈保存
#pragma pack(1)// 设置1字节对齐
struct
{
char a;
short b;
char c;
}S1;
#pragma pack(pop) // 恢复先前设置
如上所示,将对其方式设为1字节对齐,那么S1就不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

Ⅲ c语言 struct A{int a,b:A*C:}:大小为多少

12个字节,注意struct结构在计算所占字节大小的时候有一个对其的问题,与体系结构和struct内占最大字节数的变量有关。

Ⅳ 有关struct的大小

这个牵扯到内存对界(memory alignment,又称为变量对齐 )的问题,方便计算机进行处理,计算机在处理正好机器字长长度的内存单元的时候能发挥较大效率,例如32位及其,处理一个字符,实际上的过程是读入寄存器一个机器字长的内存数据,然后只处理指定字符的字节。

s {char c;int i;}; 在sizeof(char)=1 sizeof(int)=4的情况下sizeof(struct s)为什么经常是8不是5?
这个就是对齐(alignment)的缘故。
那么什么是对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就是对齐。为什么呢?msdn for vc6中有这么一段:
This principle is especially important when you write code for porting to multiple processors. A misaligned 4-byte data member, which is on an address that is not a multiple of four, causes a performance penalty with an 80386 processor and a hardware exception with a MIPS® RISC processor. In the latter case, although the system handles the exception, the performance penalty is significantly greater.
大意是:1.某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2.其余的硬件平台虽然可以在任何地址处取得任何类型的数据,但如果变量没有对齐的情况下,取这个数据可能有效率上的损失。
所以为了不出错或者优化,在访问特定变量的时候要在特定的内存地址访问,这也是很多时候管对齐叫优化对齐的缘故。普通情况下编译器负责做这件事情。对齐问题在移植的时候尤其需要考虑进去。

内存对界主要是方便计算机,一般编译器都有默认的对界大小(例如机器字长),这个对界大小可调,#pragma pack(对界大小)
struct ab{
char i;
char j;
int p;
}
vc6中int是32比特的数据char仍然8比特,前面两个char连续存放不超过一个int的大小,新的int p数据从新的适合位置(4的倍数的地址)存放一共4×2=8
struct ab{
char i;
int p;
char j;
}
因为顺序不同,int p在中间,两个char每个都要占用4字节,4×3=12

Ⅳ c语言问题,struct的大小

首先int的大小就和编译器有关.vc的话就是4

另外计算结构体大小的是以结构体中
**所占字节最大的变量的倍数**(或者说来对齐的)

简单点说,结构体大小就是其中变量所占大小的最小公倍数(这个数还必须大于所有变量所占大小的和)

你提问中c-1 i-4 f-4 d-8(我用vc)
公倍数是8,16,24,32...所有变量所占大小和是1+4+4+8=17
所以就是24了.

Ⅵ 结构体struct和联合体union(联合)有什么区别呢

一、结构体struct

各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。

二、联合体union

各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。

代码1:对比struct和union占用内存大小
[code]
#include<stdio.h>
//结构体
struct u //u表示结构体类型名
{
char a; //a表示结构体成员名
int b;
short c;
}U1;
//U1表示结构体变量名
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符

//联合体
union u1 //u1表示联合体类型名
{
char a; //a表示联合体成员名
int b;
short c;
}U2;
//U2表示联合体变量名
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符

//主函数
int main(){
printf("%d\n",sizeof(U1));
printf("%d\n",sizeof(U2));
return 0;
}

/*程序运行结果是:
12
4*/
[/code]

所有成员共用一块存储空间,在操作不同的成员时,编译器根据不同的成员类型,按照不同的方式取值。

#include<stdio.h>

//联合体
union u1
{
char a;
int b;
short c;
}U2;

//主函数
int main(){
U2.a='a';
printf("%c%c\n",U2.b,U2.c);//输出aa
U2.a='b';
printf("%c%c\n",U2.b,U2.c);//输出bb
U2.b=0x4241;
printf("%c%c\n",U2.a,U2.c);//输出AA
return 0;
}
代码3:union大小计算

union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍

代码中U3至少容纳最大e[5]=20字节,同时变量类型最大值是整数倍,即使double(字节数是8)的整数倍,因而sizeof(U3)=24。

#include<stdio.h>

//联合体
union u2
{
char a;
int b;
short c;
double d;
int e[5];
}U3;

//主函数
int main(){
printf("%d\n",sizeof(U3));//输出24
return 0;
}
代码4:union大小端模式

#include<stdio.h>

//联合体
union u3
{
char c[4];
int i;
}U4;

//主函数
int main(){
U4.C[0]=0X04;
U4.C[1]=0X03;
U4.C[2]=0X02;
U4.C[3]=0X11;
printf("%x\n",U4.i);//输出为11020304 小端
return 0;
}
代码5:struct字节对齐

U5中a四个字节,后面b和c加起来3个字节,正好补1个字节对齐;U6中b1个字节,要和后面的a对齐,需要补3个字节对齐,c也要补1个字节对齐,因而最终U6为12个字节。另外,要想改变这种默认对齐设置,可以用

#pragma pack (2) /*指定按2字节对齐*/

#pragma pack () /*取消指定对齐,恢复缺省对齐*/

#include<stdio.h>

//联合体
struct u4
{
int a;
char b;
short c;
}U5;

struct u5
{
char b;
int a;
short c;
}U6;

//主函数
int main(){
printf("%d\n",sizeof(U5));
printf("%d\n",sizeof(U6));
return 0;
}

//输出为
//8
//12

Ⅶ C语言中给怎么给struct定义一个大小

那是当然的,因为其最大容量不能超过一个int量的空间也就是32768,1200的时候,这个结构容量为:1200*30+4=36004.超过了。MAX最大容量只能为1092.

Ⅷ C语言--结构体大小

这与编译器的编译选项有关,如果按C语言的本意则结果应为401,但很多编译器都对结构类型的成员变量进行了按4字节或8字节对齐,这样做可以提高数据存储速度,对齐后结构的大小就只能是4或8的整数倍。

Ⅸ c语言struct占用空间大小问题

咋windows下double占8个字节,如果考虑对齐那就是ctm和open共用八个字节,high和low共用八个字节,close自己用八个字节,vol自己用八个字节,所以是32
linux下是double4个字节吧。

Ⅹ 这个结构体的大小是多少字节

12个字节:其中
struct
header
{
BYTE
by;
//1字节
DWORD
dw;
//4字节
int
flag;
//4字节
};
但是,结构体有一种“补齐”,就是按照
整数
型字节补齐,9字节补齐到sizeof(int)的
倍数
,就是12了。

阅读全文

与struct编程尺寸是多少相关的资料

热点内容
2014统计年鉴pdf 浏览:434
linuxoracle用户密码 浏览:757
股票交易pdf 浏览:898
p2papp源码 浏览:308
记录睡眠软件app哪个好用 浏览:140
液压助力车压缩比 浏览:217
文件服务器上如何查看 浏览:975
雪花绘制源码 浏览:662
app主页演示图怎么做 浏览:542
幼儿园设计pdf 浏览:645
干接点输入单片机 浏览:541
亚马逊云服务器查看 浏览:163
如何用免费云服务器 浏览:610
php的输出命令 浏览:264
在家怎么制作解压小玩具 浏览:99
javascript源码辅助阅读 浏览:384
pythonui开发工具 浏览:595
adr指标源码 浏览:217
程序员转架构管理 浏览:959
企业服务器为什么不能被拷贝 浏览:119