C+类的sizeof大小以及类的字节对齐

  对class求sizeof的问题总结

  首先看如下代码:

 1 class A
 2 {
 3 public:
 4     A(){};
 5     ~A(){};
 6 private:
 7     int a;
 8     double b;
 9 };
10
11 class B:public A
12 {
13 public:
14     B(){};
15     ~B(){};
16 private:
17     int a;
18     char b;
19 };
20
21 cout <<sizeof(A)<<sizeof(B)<<endl;

  首先,class的sizeof遵循以下几点:

1、class大小为非静态成员类型之和,也就是说静态成员数据,如static不作为sizeof的统计范围。

如以下代码运行结果是:1。

1 struct A
2 {
3     char c;
4     static int a;
5 };
6 cout << sizeof(A)<<endl;

2、普通成员函数不作为sizeof统计范围,包括构造析构函数。

如以下代码运行结果是:4。

1 class A
2 {
3 public:
4     show();
5 private:
6     int a;
7 };
8 cout <<sizeof(A)<<endl;

3、虚函数要维护虚函数表,占用一个指针,四个字节。

如以下代码运行结果是:4。

1 class A
2 {
3 public:
4     virtual A(){};
5 };
6 cout<<sizeof(A)<<endl;

4、class遵守字节对齐规则。

其中,字节对齐的讲解如下:

1、第一个数据成员的offset=0地方,其后每个成员从该成员的大小或者成员的倍数出开始存储。

如在32位系统中

char为1字节,可在任意位置存储;

int为4字节,只能在0-3 4-7 8-11 12-15...这些位置开始存放;

double为8字节,只能在0-7 8-15...这些位置开始存放;

为什么要这样做:因为可以提高计算机读取数据的速度,只从数据的倍数索引出进行查找,不必逐个或者跳跃查找。

2、含有数据成员为结构体或者其他类时,从其最大的子成员的倍数处开始存储。

 1 struct A
 2 {
 3     double a;
 4 };
 5
 6 struct B
 7 {
 8     int a;
 9     A b;
10 };
11 cout << sizeof(B)<<endl;

如以上代码中,A的sizeof为8字节,首先B中的int a为[0,3]存放,然后存放A b为8字节,Ab中最大子成员为double 8字节,因此必须从[8-15]开始存放,所以答案为16。

3、最终长度为其最大成员长度的倍数。

1 struct A
2 {
3     int a;
4     char c;
5 };
6 cout << sizeof(A) <<endl;

答案是:8。A的最大成员长度为4,int a[0-3],char c[4],[5-7]补全。

且听我一步步来解释:

行号1: 声明class A,若A时空类,此时sizeof(A)是1,不是0,解释可以查看我的上一篇文章《C++空类的sizeof》。

行号2-5:声明的成员函数,不纳入sizeof统计范围。

行号7-8:成员变量int为4字节,double为8字节,则总共为12字节?不对,根据字节对齐,下面再讲,class A的总大小为16字节。

同理,class B中继承了class A,则首先有16字节了,成员变量int a和char b,字节数分别为4和1,根据字节对齐总大小为24字节。

总结得较为杂乱,欢迎讨论。

时间: 2024-08-02 09:30:59

C+类的sizeof大小以及类的字节对齐的相关文章

含有虚函数的类sizeof大小

#include <iostream> using namespace std; class Base1{ virtual void fun1(){} virtual void fun11(){} public: virtual ~Base1(); }; class Base2{ virtual void fun2(){} }; class DerivedFromOne: public Base2 { virtual void fun2(){} virtual void fun22(){} }

C++ 虚基类表指针字节对齐

下面博客转载自别人的,我也是被这个问题坑了快两天了,关于各种虚基类,虚继承,虚函数以及数据成员等引发的一系列内存对齐的问题再次详细描述 先看下面这片代码.在这里我使用了一个空类K,不要被这个东西所迷惑,我使用这个空类的目的主要是为了让它产生虚基类表指针而又不引入虚基类成员变量,这样我就可以少叙述一些关于虚基类成员排放的东西,而将焦点聚集在引入的那个虚基类表指针之上.这个空类虽然有点特殊,但是在这里它其他的东西和正常的类一样,不要纠结这个.还有,代码我直接指定了对齐参数,是为了不引起混乱. #in

C++虚基类表指针字节对齐模型

关于虚基类表指针/虚函数表指针这些类里面的"隐藏成员"在结构里面是如何进行字节对齐的这个问题困惑了我48个小时.虽然网上也有很多关于虚继承.虚函数表.虚基类等内存布局的一些文章,但是基本上谈的都是大致的布局,什么地方有什么,按照什么顺序来排放等这些泛泛而谈的东西,好像都没有把字节对齐方面考虑进去的文章,或许他们都没有考虑到一些复杂层次的类继承关系,从而字节对齐的问题也没有成为问题,也自然而然地会被忽略掉,或者得出错误的对齐规则结论. 也许是我一开始就走错了路,在错误中越走越远,尝尽了各

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

Base类sizeof大小 -- C++

Base类只是一个指针,所以Base大小是4个字节. 但Base类中添加一个int a,Base的大小变成8字节. #include <iostream> #include <complex> using namespace std; class Base1 { public: Base1(){cout << "Base1" << endl;} ~Base1(){cout << "~Base1" <&

类类型的大小

1:先看一个空类的大小: #include <iostream> using namespace std; class A { }; int main(int argc, char** argv) { cout<<sizeof(A)<<endl; return 0; } sizeof(A)的结果为1: #include <iostream> using namespace std; class A { public: A(); ~A(); }; int ma

类内数组声明,“类外”指定大小

类内数组声明,“类外”指定大小 using namespace std; class Age{ public: static const int Value = 10; static const int ages[]; }; const int Age::ages [] = {1,2,3}; int main() { cout << "xxx Age:" << Age::Value << "ages size:"<<

c++ 类的sizeof

sizeof()是c++的运算符,返回变量或者类型占用的字节数.如sizeof(int) 为4,sizeof(char) 为1. 那么类大小呢,如 1 class A { 2 char a; 3 short b; 4 int c; 5 } 那么sizeof(A)为多少,结果是8.char占用一字节,b占用2字节,int占用4字节,A为什么是12字节.这就涉及到c++字节对齐问题,如int类型的地址是4的倍数,short类型的地址是2的倍数.包含int的对象的指针也是4的倍数.所以如果A的指针为p

list集合、txt文件对比的工具类和文件读写工具类

工作上经常会遇到处理大数据的问题,下面两个工具类,是在处理大数据时编写的:推荐的是使用map的方式处理两个list数据,如果遇到list相当大数据这个方法就起到了作用,当时处理了两个十万级的list,使用改方法的变种搞定. 1.txt文件.list集合比较工具 <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.hudong.util.other; import java.util.Colle