C++结构的大小

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/36945995         我们在使用任何一门编程语言时,都离不开基本数据类型,即使该语言的数据类型是弱类型的,当我们在面向对象编程的时候,类的大小与类中属性的声明有什么关系呢?现在我们就一起探讨一下。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/36945995

        我们在使用任何一门编程语言时,都离不开基本数据类型,即使该语言的数据类型是弱类型的,当我们在面向对象编程的时候,类的大小与类中属性的声明有什么关系呢?现在我们就一起探讨一下。

        下面我们看下面一段代码:

         

#include 

using namespace std;

int main()
{
    cout << "size of short =" << sizeof(short) << endl;             // 2
    cout << "size of int = " << sizeof(int) << endl;                // 4
    cout << "size of short int = " << sizeof(short int) << endl;    // 2
    cout << "size of long = " << sizeof(long) << endl;              // 8
    cout << "size of long int = " << sizeof(long int) << endl;      // 4
    
    cout << "size of char = " << sizeof(char) << endl;              // 1
    
    cout << "size of float = " << sizeof(float) << endl;            // 4
    cout << "size of double = " << sizeof(double) << endl;          // 8
    cout << "size of long double = " << sizeof(long double) << endl; //12
    
    return 0;
}

该代码段用于测试C++中的基本数据类型的大小,首先声明一下,我们测试机是ubuntu12.04,32位系统,编译器为gcc4.7.2.代码后面的注释即为显示的结果。由此我们可以得出基本类型的大小。那么由此我们引申到结构中,请看下面几行代码:
#include 

using namespace std;

struct person
{

};

struct student
{
    char a;
};

struct police
{
    short s;
};

struct clerk
{
    int i;
};

struct flower
{
    char c;
    short f;
};

struct desk
{
    int i;
    char c;
};

struct book
{
    int i;
    short s;
    char c;
};

int main()
{
    cout << "size of person = " << sizeof(person) << endl;     // 1
    cout << "size of student = " << sizeof(student) << endl;   // 1
    cout << "size of police = "  << sizeof(police) << endl;    // 2
    cout << "size of clerk = " << sizeof(clerk) << endl;       // 4
    cout << "size of flower = " << sizeof(flower) << endl;     // 4
    cout << "size of desk = " << sizeof(desk) << endl;         // 8
    cout << "size of book = " << sizeof(book) << endl;         // 8
    return 0;
}
那么这是什么原因呢?
首先,我们看第一个结构person:
特点:内部什么属性都没有
大小:1B
由此可以看出,什么属性都没有的结构,其默认的大小为1B,即8位

结构:student
特点:只有一个属性a,其类型为char类型,单独的char类型的大小为1B
大小:1B

结构:police
特点:只有一个属性s,其类型为short,单独的short类型的大小为2B
大小:2B

结构:clerk
特点:只有一个属性i,其类型为int,单独的int的大小为4B
大小:4B

由以上三个类与第一个类的比较可以看出,当结构中没有属性的时候,结构的默认大小为1B,一旦有了至少一个属性,则结构的大小是由其中的属性大小决定的。

结构:flower
特点:有一个char类型的属性c和一个short类型的属性s
大小:4B

结构:desk
特点:有一个int类型的属性i和一个char类型的属性c
大小:8B

结构:book
特点:有一个int类型的属性i,一个short类型的属性s和一个char类型的属性c
大小:8B

由此可以看出,由内存对齐的观点可以看出,在一个结构中的对齐模数是基本数据类型最大的值,就像book结构,由三个基本数据类型:int,short,char,其中大小最大的应该为int类型,4B,所以以4B作为模数,进行内存对齐。i放在结构的偏移量的0处,占用4B的空间,在i的结尾处继续添加s,由于s所占的空间小于4B,所以编译器需要看该结构后面是否还有属性,若没有,则自动填充到4B的空间,若有,则继续添加,在该实例中,s后还有c,则在s之后继续添加c,由于c只占1B的空间,所以s和c总的空间才3B,还是没有达到模数,则编译器自动填充空间,到4B的空间,所以,book的大小为8B。

这仅仅是对于一种编译器和一个平台进行的测试,不同的编译器和不同的平台得出的结果是不一样的,但是原理都是一样的,所以弄懂这些东西,对于理解结构的大小和基本数据类型的大小还是比较有用处的。

目录
相关文章
|
6月前
|
C++
C++选择结构
C++选择结构
88 0
|
6月前
|
C语言 C++
C/C++ 自定义头文件,及头文件结构详解
还是从"stdio.h"说起,这是C语言中内置的标准库,也就是说,头文件很多时候其实就是一个“库”,类似于代码的仓库,也就是说将某些具有特定功能的常量、宏、函数等归为一个大类,然后放进这个“仓库”,就像stdio.h就是一个标准输入/输出的头文件
206 1
|
6月前
|
C++
C++程序中的选择结构
C++程序中的选择结构
47 2
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
46 2
|
6月前
|
算法 测试技术 C++
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(下)
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(下)
|
6月前
|
C++ 容器
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
|
3月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
34 5
|
3月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
35 0
|
3月前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
37 0
|
5月前
|
存储 测试技术 C++
C++中的结构
C++中的结构
25 2