【C/C++】基本数据类型和结构体占用字节数

最近复习C++,发现把很多基础知识都还回老师了W( ̄_ ̄)W 越是基础的东西,越是重要,但也容易把它不当回事,下面总结一下: 1、基本数据类型在不同编译器的占用字节数 2、结构体因为内存对齐产生的空间浪费问题 3、空结构体占用空间问题 【一】基本数据类型 基本数据类型占用多少字节,并没有明确的规定,具体由机器、操作系统、编译器决定。 但要遵守以下规定: 1、int型数据所占字节数不大于long型,不小于short型 2、short int短整型至少占16位 3、long [int]长整型至少占32位 在不同位数的机器上不同数据类型所占字节数: ==========16位编译器========= char:1个字节 short int : 2个字节 unsigned int : 2个字节 int: 2个字节 float: 4个字节 double: 8个字节 long: 4个字节 unsigned long: 4个字节 long long: 8个字节 指针变量: 2个字节(16位) ========================== ==========32位编译器========= char:1个字节 short int : 2个字节 unsigned int : 4个字节 int: 4个字节 float: 4个字节 double: 8个字节 long: 4个字节 unsigned long: 4个字节 long long: 8个字节 指针变量: 4个字节(32位) ========================== ==========64位编译器========= char:1个字节 short int : 2个字节 unsigned int : 4个字节 int: 4个字节 float: 4个字节 double: 8个字节 long: 4个字节 unsigned long: 4个字节 long long: 8个字节 指针变量: 8个字节(64位) ========================== 【2】结构体内存对齐 先看一段程序:

#include<iostream>
using namespace std;
struct StructA{ 
    char a1;
    short a2;
    int a3;
    int* a4;
};
struct StructB{
    short a2;
    int a3;
    char a1;
    int* a4;
};
int main()
{
    cout << "sizeof(char)=" << sizeof(char) << endl;
    cout << "sizeof(short)="<<sizeof(short) << endl;
    cout << "sizeof(int)=" << sizeof(int) << endl;
    cout << "sizeof(int*)=" << sizeof(int*) << endl;
    cout << "sizeof(StructA)=" << sizeof(StructA) << endl;
    cout << "sizeof(StructB)=" << sizeof(StructB) << endl;
    system("pause");
    return 0;
}

输出: 20160401_01 StructA和StructB的变量完全相同,只是变量顺序不同,通过计算应该都是占用1+2+4+8=15字节。但实际上StructA占用16字节,浪费了1个字节;StructB占用24字节,浪费了9个字节。如果创建数量巨大的StructB对象,这个浪费非同小可,所以合理地设计结构体也是一件很重要的事情。 为什么会这样呢? 这是由于存储变量时内存地址对齐的要求,编译器在编译时会遵循两条原则: 1、结构体变量中成员的偏移量是成员大小的整数倍(第一个变量偏移量为0) 2、 结构体大小是所有成员大小的整数倍。 至于为什么要内存对齐,主要是考虑到不同平台的兼容性和CPU访问内存速度。 【3】空结构体占用空间

#include<iostream>
struct StructA{};
class ClassB{};
int main()
{
    StructA a[100];
    std::cout <<"sizeof(StructA)="<< sizeof(StructA) << std::endl;
    std::cout <<"sizeof(ClassB)="<< sizeof(ClassB) << std::endl;
    std::cout << "sizeof(a)=" << sizeof(a) << std::endl;
    system("pause");
    return 0;
}

输出: 20160401_022 结构体StructA和类ClassB都是空的,但它们还是占用一个字节。 这是因为C++标准规定no object shall have the same address in memory as any other variable,即不同对象不能有相同的内存地址,所以给空结构体和空类分配一个字节。如果不分配,创建一个对象数组的话,就会出现数组中每个对象地址都相同的情况。 至于空结构体有什么神奇的作用,博主暂时也没想到,存在即合理,以后会发现其用处的。 但是,查资料得知在C语言里空结构体占用0字节,这个…博主没有亲自验证,今天真是愚人节呀(@_@)。 【2016-04-01 15:09:22】

发表评论

电子邮件地址不会被公开。 必填项已用*标注