字节对齐-------结构体、共用体

字节对齐
结构体字节对齐:(结构体成员的数据类型为基本数据类型(int,double,char,short,long等))
结构体的总大小是结构体成员中最宽基本数据类型大小的整数倍
#include<iostream>
using namespace std;
struct S0
{
int a;
char b;
short c;
};
struct S1
{
char b;
int a;
short c;
};
struct S2
{
short d;
char b;
short e;
int a;
short c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
S2 s2;
cout << sizeof(s2) << endl;
}
输出结果:
8
12
16

总结:对于这种成员数据类型都为基本数据类型的结构体:
1.若最宽基本数据类型的成员位置在结构体成员的边上(最上边/最下边),则其它小的数据类型字节数之和与最宽的类型大小对齐(整数倍),而结构体的大小就是最宽的数据类型大小与其它的对其后的大小(整数倍)之和;
如S0:
最宽(大)的类型为int(4字节) 其它:char(1个字节),short(2个字节) 总共3字节,与int对齐后为4字节,则结构体S0的字节大小为4+4=8 字节
2.若最宽基本数据类型的成员在结构体成员的中间位置,则是最宽的成员的上面和下面分别与最宽数据类型对齐(整数倍),则结构体的大小为3者之和(对齐后的)
如S1:
最宽(大)的类型为int(4字节) 上面:char(1字节) 对齐后占用4字节
下面:short(2字节) 对齐后占用4字节 则结构体的大小为4+4+4=12字节
如S2:
最宽(大)的类型为int(4字节) 上面:short(2字节) + char(1字节) +short(2字节)=5字节 对齐后占用8字节 (4的整数倍)
下面:short(2字节) 对齐后占用4字节 则结构体的大小为8+4+4=16字节

共用体大小:共用最宽的数据类型的空间大小
#include<iostream>
using namespace std;
union S1
{
int a;
long long b;
};

union S0
{
short b[3];
int a;
short c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
执行结果:
8
8
分析:
S1;最宽数据类型为long long(8)字节,所以共用这8个字节空间,共用体大小为8字节
S0:最宽数据类型为int(4字节),但是数组b short(2字节)*3=6字节,向上取4整数倍为8,所以共用8个字节空间

共用体里面包含结构体(或者共用体)
共用体的最大基本数据类型大于或等于其内部结构体(共用体)的在空间大小,则共用最大基本类型的字节空间
#include<iostream>
using namespace std;
struct S0
{
int a;
};
union S1
{
int a;
S0 b;
long long c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
输出:
4
8

共用体的最大基本数据类型小于其内部结构体(或者共用体)的字节空间,则共用结构体(或者共用体)字节空间
#include<iostream>
using namespace std;
struct S0
{
int a;
long long b;
};

union S1
{
int a;
S0 b;
long c;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
输出:
16
16

结构体里面包含共用体(或者结构体)
结构体里面的基本数据类型没有其内部共用体(或者结构体)中的最大基本数据类型大;则遵照结构体中只有基本数据类型的规则向其内部共用体(结构体)中的最大基本数据类型字节数对齐
#include<iostream>
using namespace std;
union S1
{
int a;
};
struct S0
{
short a;
S1 cl;
char b;
};
void main()
{
S1 s0;
cout << sizeof(s0) << endl;
S0 s1;
cout << sizeof(s1) << endl;
}
输出:
4
12
#include<iostream>
using namespace std;
struct S0
{
int a;
long long b;
};
struct S1
{
int a;
S0 d;
long b;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
输出:
16
32

结构体里面的基本数据类型比其内部共用体(或者结构体)中的最大基本数据类型大或者相同,则向结构体里面的最大数据类型对齐(小的加起来对齐时还需加上共用体的大小)
#include<iostream>
using namespace std;
union S1
{
int a;
};
struct S0
{
int a;
S1 cl;
long long b;
};
void main()
{
S1 s0;
cout << sizeof(s0) << endl;
S0 s1;
cout << sizeof(s1) << endl;
}
输出:
4
16
#include<iostream>
using namespace std;
struct S0
{
char a;
};
struct S1
{
S0 d;
long b;
};
void main()
{
S0 s0;
cout << sizeof(s0) << endl;
S1 s1;
cout << sizeof(s1) << endl;
}
输出:
1
8

原文地址:http://blog.51cto.com/13665347/2118554

时间: 2024-10-07 18:18:24

字节对齐-------结构体、共用体的相关文章

8.1 结构体 共用体 typedef 枚举

typedef :  给类型起一个新的名字 int main() { unsigned int a = 10; } 可以用下面表示: typedef unsigned int u32_t; int main() { u32_t a = 10; } 与definde的区别: typedef char *  N; #define N char* N p1,p2,p3; define的话  p2 p3 变成了char 类型 结构体 :不同类型元素的汇聚 ①匿名结构体 struct{ int id;  

瘋子C语言笔记(结构体/共用体/枚举篇)

 (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct date birthday; /*birthday 是 struct date 类型*/ char addr[30]; }student1,student2; (1):结构体可嵌套 (2):与枚举相比结构体内元素为变量,而枚举为常

C语言 共用体

//共用体 union #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> // union 共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖) //共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存 union data{ char c; int a[10]; }udat1; union stu{

C++结构体字节对齐

本站文章均为Jensen抹茶喵原创,转载务必在明显处注明:转载自[博客园] 原文链接:http://www.cnblogs.com/JensenCat/p/4770171.html 直接上源码吧!~ 这里是头文件结构的定义: 一个非字节对齐结构体_tagTest2 一个字节对齐_tagTest3 (使用#pragma pack(push,1)来使字节以1个来对齐 , 使用#pragma pack(pop)来还原默认) 1 #pragma once 2 3 4 struct _tagTest1 5

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

共用体与枚举

共用体 共同体和结构体类似,也是一种构造类型的数据结构,既然是构造类型的,咱们先定义除类型,然后用类型定义变量 定义共用体类型得方法和结构体非常相似,把struct 改成union就可以 在进行某些算法得时候,需要使几种不同类型的变量存到同一段内存单元中,几个变量间相互重叠 这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作"共用体"类型结构,共用体所有成员占有同一段地址空间 共用体的大小是其占内存长度最大的成员的大小 举例 typedef struct data{ shor

C 共用体

C 共用体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 定义共用体 为了定义共用体,您必须使用 union 语句,方式与定义结构类似.union 语句定义了一个新的数据类型,带有多个成员.union 语句的格式如下: union [union tag] { member definition; member definition; ... member d

golang 字节对齐

最近在做一些性能优化的工作,其中有个结构体占用的空间比较大,而且在内存中的数量又特别多,就在想有没有优化的空间,想起了 c 语言里面的字节对齐,通过简单地调整一下字段的顺序,就能省出不少内存,这个思路在 golang 里面同样适用 基本数据大小 在这之前先来看下 golang 里面基本的类型所占数据的大小 So(unsafe.Sizeof(true), ShouldEqual, 1) So(unsafe.Sizeof(int8(0)), ShouldEqual, 1) So(unsafe.Siz

关于结构体字节对齐的笔记

1,空结构体的字节大小为:1: 2,含有static成员的结构体:sizeof 只算存栈中分配的空间大小,static成员存储在全局数据区内,故 static 成员变量不计算在内. 3,在默认对齐方式中,每种类型的存储开始地址是 能被该类型大小整除的地址.故:每次计算都假设结构体开始地址是 0: 4,遇到成员是结构体变量的:将此结构体变量当做一个数据类型,但是: 注意: 千万不能把此结构体的 sizeof 当做该变量的类型大小 也不能直接将此结构体拆解开 解法: 此结构体成员变量的类型大小 理解