C语言 sizeof关键字
2015-12-20 18:38
281 查看
sizeof是C语言的一个关键字,而不是一个函数,字节数的计算再程序编译时进行,而不是在程序执行过程中。因此像int arr[sizeof(int)]这样的表达式是正确的。sizeof的功能是求一个对象或者类型所占的内存字节数。因此在win32环境中,下面的这些结果都是正确的。
char data1; sizeof(data1) = 1;
short data2; sizeof(data2) = 2;
int data3; sizeof(data3) = 4;
long data4; sizeof(data4) = 4;
float data5; sizeof(data5) = 4;
double data6; sizeof(data6) = 8;
char* data7; sizeof(data7) = 4;
short* data8; sizeof(data8) = 4;
int* data9; sizeof(data9) = 4;
long* data10; sizeof(data10)= 4;
float* data11; sizeof(data11)= 4;
double* data12; sizeof(data12)= 4;
稍微复杂一点的是用sizeof求结构体所占内存大小。
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
对于结构体A
struct A {
char a;
double b;
int c;
};若按4字节对齐,则sizeof(A)=16;若按8字节对齐,则sizeof(A)=24。
对于结构体重存在位域的情况,如
struct A {
unsigned char c1:2;
unsigned char c2:2;
unsigned char c3:2;
unsigned char c4:2;
unsigned char c5:1;
};不管按多少字节对齐,sizeof(A)=2。位域是先往一个字节中存储,如果存储满了则存储到下一个字节中,所以A中c1、c2、c3和c4存储在第一个字节中,c5存储在第二个字节中。它的默认对齐长度是1字节。
char data1; sizeof(data1) = 1;
short data2; sizeof(data2) = 2;
int data3; sizeof(data3) = 4;
long data4; sizeof(data4) = 4;
float data5; sizeof(data5) = 4;
double data6; sizeof(data6) = 8;
char* data7; sizeof(data7) = 4;
short* data8; sizeof(data8) = 4;
int* data9; sizeof(data9) = 4;
long* data10; sizeof(data10)= 4;
float* data11; sizeof(data11)= 4;
double* data12; sizeof(data12)= 4;
稍微复杂一点的是用sizeof求结构体所占内存大小。
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
对于结构体A
struct A {
char a;
double b;
int c;
};若按4字节对齐,则sizeof(A)=16;若按8字节对齐,则sizeof(A)=24。
对于结构体重存在位域的情况,如
struct A {
unsigned char c1:2;
unsigned char c2:2;
unsigned char c3:2;
unsigned char c4:2;
unsigned char c5:1;
};不管按多少字节对齐,sizeof(A)=2。位域是先往一个字节中存储,如果存储满了则存储到下一个字节中,所以A中c1、c2、c3和c4存储在第一个字节中,c5存储在第二个字节中。它的默认对齐长度是1字节。
相关文章推荐
- C语言连接MySQL数据库(课程设计总结)
- Java 与 C++ 不一样的地方(持续更新中...)
- Effective C++中文版 条款41-44
- C++中命名空间内只能声明函数,不能定义
- litcode 合并两个排序链表 递归求解
- C++11中emplace_back和push_back的区别
- C++命名空间
- 【转】C语言知识整理(3):内存管理(详细版)
- 也谈“中断”
- 总结C++中三种关于"new"的使用方法
- C++之路起航——标准模板库(list)
- Google C++ 风格指南 命名约定 转
- poj 2777 Count Color(线段树+染色问题)
- 修饰 C++ 成员函数的两种关键字总结
- 修饰 C++ 成员函数的两种关键字总结
- C语言知识整理(3):内存管理(详细版)
- C++之路起航——标准模板库(vector)
- 《C++标准程序库》笔记之四
- Cpp--getch(),getche(),getchar()的区别
- CPP入门(3):输入、输出