#include #include #pragma comment(lib,"Ws2_32.lib")usin"> struct和union的大小问题 - 11GX
首页 > struct和union的大小问题

struct和union的大小问题

union类型以其中size最大的为其大小

struct类型以其中所有size大小之和为其大小
#include<iostream>

using namespace std;



int main()

{

    typedef union 
{ long i; int k[5]; char c;} DATE;

    
struct data int cat; DATE cow; double dog;} too;

    DATE max;



    cout
<<"sizeof(struct date)+sizeof(max) = "<<sizeof(too)+sizeof(max)<<endl;

    cout
<<"sizeof(too) = "<<sizeof(too)<<endl;

    cout
<<"sizeof(max) = "<<sizeof(max)<<endl;

    cout
<<"struct data.cow size = "<<sizeof(too.cow)<<endl;

    cout
<<"union DATE.i size = "<<sizeof(max.i)<<endl;

    cout
<<"union char.c size = "<<sizeof(max.c)<<endl;



}
sizeof(struct date)+sizeof(max)返回52

#include<iostream>

using namespace std;



int main()

{

    typedef union student 

{

       
char name[10];

       
long sno; 

       
char sex; 

       
float score [4]; 

}
 STU; 



STU a[
5];



cout
<<sizeof(a)<<endl;



return 0;



}
 
初始化了一个含有5个UNION的数组,由于UNION以其中最大的元素float作为大小  16*5=80



#include<iostream>

using namespace std;



int main()

{

    typedef 
struct student 

{

       
char name[10];

       
long sno; 

       
char sex; 

       
float score [4]; 

}
 STU; 



STU a[
5];



cout
<<sizeof(a)<<endl;



return 0;



}
 
输出为180

自然对齐(natural alignment)即默认对齐方式,是指按结构体的成员中(类型)size最大的成员作为基本的分配单元,而且与其顺序有这密切的联系。size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;Long sno; 4个字节;Char sex; 4个字节(这里对齐了);Float score [4]; 16个字节。于是(12+4+4+16)×5=180



#include<iostream>

using namespace std;



int main()

{

    typedef 
struct student 

{

       
char name[10];

       
char sex; 

       
long sno; 

       
float score [4]; 

}
 STU; 



STU a[
5];



cout
<<sizeof(a)<<endl;



return 0;



}
 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160

转载于:https://www.cnblogs.com/cobain/archive/2008/01/31/1060271.html

更多相关:

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...

  • 在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数。 函数原型: C++: Mat Mat::reshape(int cn, int rows=0) const 参数比较少,但设置的时候却要千万小心。 cn: 表示通道数(channels), 如果设为0,...

  • // WindowsSocketServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #pragma comment(lib,"Ws2_32.lib")usin...