union、enum、struct 内存分配问题

代码和运行结果一看就懂了。

union un
{
int m;
float c;
double p;
long k;
unsigned int q;
long long g;
__int64 o;
};
enum em
{
a,b,c,d
};
struct MyStruct
{
char a;//4
float c;//4
char b;//4
double p;//8
char m1;
int k;//8
char kk;
};
struct MyStruct1
{
char a;//4
};
struct MyStruct2
{
char a;//4
float c;//4
};
#pragma pack(16)
struct MyStruct3
{
char a;//4
double c;//4
};
#pragma pack()
struct MyStruct4
{
char m;
float a;
int a1;
double c;//4
float b;
};
cout << "int=" << sizeof(int) << endl;
cout << "float=" << sizeof(float) << endl;
cout << "double=" << sizeof(double) << endl;
cout << "long=" << sizeof(long) << endl;
cout << "char=" << sizeof(char) << endl;
cout << "unsigned int=" << sizeof(unsigned int) << endl;
cout << "long long=" << sizeof(long long) << endl;
cout << "__int64=" << sizeof(long double ) << endl;
cout << "MyStruct1=" << sizeof(MyStruct1) << endl;
cout << "MyStruct2=" << sizeof(MyStruct2) << endl;
cout << "MyStruct3=" << sizeof(MyStruct3) << endl;
cout << "MyStruct4=" << sizeof(MyStruct4) << endl;
cout << sizeof(un) << endl << sizeof(em)<<endl << sizeof(MyStruct)<<endl;

时间: 2024-08-05 18:59:30

union、enum、struct 内存分配问题的相关文章

enum,struct,union类型使用和长度

VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma pack() 来使编译器以单字节对齐. 今天在bcb5中调用vc6的dll时出现错误,但在VC中调用dll却很正常,说明很有可能是编译器之间的差异造成.仔细debug后发现bcb和vc的枚举类型长度不一样,即便使用了#pragma pack(1)编译开关. 如以下程序: /*-----------

c语言关键字-struct,union,enum及柔性数组

一.struct关键字与柔性数组 c语言中的struct可以看做变量的集合,struct中的每个数据成员都有独立的存储空间 柔性数组:柔性数组在C99中也称之为伸缩型数组,是C99的扩展,简言之就是struct结构里的标识占位符(不占用struct的空间),柔性数组的结构只能在堆上生成. 声明柔性数组的规则 柔性数组成员必须为结构(struct)中的最后一个成员 结构中至少有一个其他成员 柔性数组就像普通数组一样被声明,除了它的方括号内为空 1 struct softarry 2 { 3 int

笔试题之union与struct

union与struct之间的区别,说起来简单,struct内各变量是拥有独立的内存,union里面各变量共享内存,修改一个变量的值也既修改了另一个值. 然而,今天中兴笔试遇到这样一个问题 union { struct { int a; int b; } e; int i; int j; } u; u.i=1; u.j=2; u.e.a=u.i*u.j; u.e.b=u.i*u.j; printf(“%d",u.e.a); printf("%d",u.e.b): 结果是4和1

用union 和 struct 位域操作

很久没有用C 语言中的 union 和 struct 位域操作了. 最近用了一下(当然,我承认是从stackoverflow 上抄的) 需求是这样的,已知一个 LPARAM 整数 3866625 ,求他的第30位的值是多少. 解法也挺简单 int a = 3866625; a = a>>30 & 0x0001; //注意是右移动30,而不是29,因为第一位是0 ,我一开始就移动的29 结果算错! 但是我偶然在stack over flow 上看到了 另外一种方案 union KeySt

struct内存对齐1:gcc与VC的差别

struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T).比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始.Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模

关于const和define的内存分配问题的总结

关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1,  const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝. 2,  #define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值. 3,  #define宏没有类型,而const修饰的只读变量具有特定的类型. 总结:const节省了空间,避免了不必要的内存分配,同时提高了

union, enum, and struct, 以及结构填充和位字段实现。

Table 4-9 Compiler storage of data objects by byte alignment Type Bytes Alignment char, bool, _Bool 1 Located at any byte address. short, wchar_t 2 Located at any address that is evenly divisible by 2. float, int, long, pointer 4 Located at an addres

C语言union关键字,union和struct区别

union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址.例子如下: union StateMachine { char character; int number; char *str; double exp; }; 一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,

c语言中union及struct区别

union(联合体)使用类似于struct(结构体),但是它与struct有如下明显差异: 1.union中可以定义多个成员变量,union的大小由最大的成员的大小决定.struct同样可由多个数据类型成员组成,struct的大小也是所有成员的大小之和(考虑对齐). 2.union一次只能使用其中一个成员,所有成员共享同一块内存.当对其它成员进行赋值,原来成员的值就不存在了.而struct成员的赋值是不会互相影响的. 3.union只能用其第一个成员类型的值进行初始化. 版权声明:本文为博主原创