zoukankan      html  css  js  c++  java
  • sizeof的用法

    因为对sizeof不是很了解,所以去查了博客啥的,发现还是有大学问的,以下对其用法进行总结。

    参考:https://www.cnblogs.com/zhangyz/articles/4736758.html

    首先sizeof是个运算符而非函数,因此括号并不是必须的。之所以经常看到括号是为了强调优先级。

    1.当sizeof对象是表达式的时候,返回值为类型大小而不是表达式的值,比如:

    1 char c = 1;
    2 int i = 2;
    3 cout << sizeof(c + i) << endl;
    4 cout << sizeof(c = c + i) << endl;

    前者输出的是4,即int的类型所占字节大小(32位系统),而后者则输出1,因为虽然表达式转型成int,但是表达式最终赋值给char的c,即输出char所占字节。

    2.对数组使用sizeof,得到的是数组所占字节,如下:

    1 int a[13];
    2 cout<<sizeof(a)<<endl;
    3 cout<<sizeof(a[0])<<endl;

    前者输出52,而后者输出4。

    3.sizeof无法获取动态分配的内存大小

    4.注意字符串类型的末尾存在结束符,占一个char空间。因此sizeof("1")返回2。而stelen返回字符个数,不包括结束符,两者区分。

    5.对结构体使用sizeof,理论上是所有成员数据的大小总和,但考虑到对齐问题,会自动填充字节,以8字节为一个单位。如:

    1 struct node
    2 {
    3     int a;
    4     char c;
    5 };

    对其sizeof,返回值为8,填充3字节。

    1 struct node
    2 {
    3     int a;
    4     char c;
    5     int d[];
    6 };

    对其sizeof,返回值仍为8。

    6.对类使用sizeof。

    首先要明确c++的struct本质是类,与c中的不同。

    当类为空类时,理论大小应该为0。但是实例化类的时候,它必须在内存中占据一定空间,其所占空间由编译器决定。以g++为例,空类的对象占1字节空间。

    类中的构造函数、析构函数、成员函数调用时只需知道函数地址,而函数地址与函数类型相关,与实例化的类无关,因此不会在实例中额外添加信息。

    静态数据成员放在全局数据成员中,不占实例大小,可以看作特殊全局变量。

    1 class A
    2 {
    3     public:
    4         static int a;
    5         static char c;
    6         A(){};
    7         ~A(){};
    8         void foo(){};
    9 };

    综上,对此空类sizeof,返回值为1。因为静态数据成员a,c和成员函数不占类的大小。

    对于非静态数据成员,和c的struct类似,需要对齐,即字节填充。

    1 class A
    2 {
    3     public:
    4         int a;
    5         char c;
    6         A(){};
    7         ~A(){};
    8         void foo(){};
    9 };

    对其sizeof,返回值为8.a占4B,c占1B,填充3B。

    如果有类中有虚函数,则该类的实例中会产生一个指向虚函数表的指针,指针会占据空间。如果普通类继承,子类和基类共享指针。

     1 class A
     2 {
     3     public:
     4         int a;
     5         char c;
     6         A(){};
     7         ~A(){};
     8         void foo(){};
     9         void virtual bar(){};
    10 };

    对其sizeof,返回值为12。数据成员8B,加上指针4B(32位系统,64位系统中为8B)。

    虚继承时,派生类会生成指向虚基类表指针,占一个指针的空间。增加额外的虚函数时,不增加额外的的指针空间。

    1 class A
    2 {
    3     int a;
    4 };
    5 class B: public virtual A
    6 {
    7     int b;
    8     virtual void foo(){};
    9 };

    对B进行sizeof,返回值为12.数据成员b占4B,从A继承的a占4B,额外增加虚函数的指针4B。

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/luoyang0515/p/10186426.html
Copyright © 2011-2022 走看看