C++ | class size

c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。

  1. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
  2. 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
  3. 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
  4. 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Pointer to virtual base class);
 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class A {};
 6
 7 class B {};
 8
 9 class C : public A {
10     virtual void func() = 0;
11 };
12
13 class D : public B, public C {};
14
15 class E {
16 public:
17     virtual void e() {};
18 private:
19     char abc[3];
20 };
21
22 class F : public E {
23 public:
24     virtual void f() {};
25 };
26
27 class G : virtual public E {};
28
29 class H {
30 public:
31     virtual void h() {};
32 private:
33     char abc[3];
34 };
35
36 class I : public E, public H {};
37
38 class J : virtual public E {};
39
40 class K : public G, public J {};
41
42 class L {
43     static int l;
44     static void la() { static int m; }
45 };
46
47 int main() {
48     cout << "sizeof(A) = " << sizeof(A) << endl; // 空类,大小为1
49     cout << "sizeof(B) = " << sizeof(B) << endl; // 空类,大小为1
50     cout << "sizeof(C) = " << sizeof(C) << endl; // 虚函数表指针 (64位机器指针为8个字节)
51     cout << "sizeof(D) = " << sizeof(D) << endl; // 虚函数表指针
52     cout << "sizeof(E) = " << sizeof(E) << endl; // 字节对齐+虚函数表指针(8 + 8)
53     cout << "sizeof(F) = " << sizeof(F) << endl; // 同E
54     cout << "sizeof(G) = " << sizeof(G) << endl; // 虚继承,还包含一个父类的指针,所以是父类指针 + 虚函数表指针 + 字节对齐 = 24
55     cout << "sizeof(H) = " << sizeof(H) << endl; // 同E
56     cout << "sizeof(I) = " << sizeof(I) << endl; // 两个虚函数指针分别指向E和H + 两个数组字节对齐 = 32
57     cout << "sizeof(J) = " << sizeof(J) << endl; // 同G
58     cout << "sizeof(K) = " << sizeof(K) << endl; // 一个指向父类(E)的指针 + 两个虚函数指针分别指向G和J + 一个字节对齐 = 32
59     cout << "sizeof(L) = " << sizeof(L) << endl; // 静态变量不占空间
60     return 0;
61 }

输出:

 1 sizeof(A) = 1
 2 sizeof(B) = 1
 3 sizeof(C) = 8
 4 sizeof(D) = 8
 5 sizeof(E) = 16
 6 sizeof(F) = 16
 7 sizeof(G) = 24
 8 sizeof(H) = 16
 9 sizeof(I) = 32
10 sizeof(J) = 24
11 sizeof(K) = 32
12 sizeof(L) = 1

C++ | class size

时间: 2024-08-29 14:28:04

C++ | class size的相关文章

Java学习-050-AES256 之 java.security.InvalidKeyException: Illegal key size or default parameters 解决方法

在进行 Java AES 加密测试时,出现如下错误信息: java.security.InvalidKeyException: Illegal key size or default parameters at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026) at javax.crypto.Cipher.implInit(Cipher.java:801) at javax.crypto.Cipher.chooseProvider(Cip

aes加解密 Illegal key size

做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前也是遇到加密问题,从oracle官网下载了两个文件,覆盖本地文件得到解决. 推测测试环境肯定也是此原因,照此方法,测试环境aes加解密问题得到解决,特此记录下来,避免下次再踩坑. 问题背景: Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_poli

理解CSS3中的background-size(对响应性图片等比例缩放)

2016-03-10 01:40 by 空智, 7463 阅读, 8 评论, 收藏, 编辑 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用background-size:400px 200px缩放设置 固定宽度400px和高度200px-使用background-size:400px;的缩放设置,那么第二个参数会自动转换为auto 固定宽度400px和高度200px-使用background-size:100% 100%

关于sizeof()、size()的有些问题

#include<iostream>using namespace std; int main() { char a[] = "abcdefg"; string s = a;     int len = sizeof(a);  //len = 8: int len_s = sizeof(s);  // len_s = 28: int lenth = s.size();   //lenth = 7; int lenth_a = strlen(a);// lenth_a = 7

.length()与.size()

.length()属于数组或者字符串的一个属性,可以获得该数组或者字符串的长度,返回一个整型数据 .size()属于List泛型对象的一个方法,返回一个list对象中存储的元素个数,也是整型数据 Integer[] i = new Integer[10]; System.out.println(i.length()); //10 List<String> list = new ArrayList<String>(); System.out.println(list.size());

mysql触发器应用和创建表错误代码: 1118 Row size too large. 解决

1.针对数据库查询问题的方便,可以建立重要表的log备份记录表,在主表的添加,修改,删除添加触发器,修改触发器增加触发字段的点,限制条件. 数据库log表查问题比从线上多台服务器上下载日志文件相对方便,但是两者的侧重点不同. 2.错误代码: 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhe

Intellij IDEA中file size exceeds configured limit解决

把Hadoop源码导入IDEA中后,其中有个ClientNamenodeProtocolProtos文件代码高达82997行,IDEA直接就不把它当java类看了,报file size exceeds configured limit错误. 解决办法如下: 你可以尝试修改intellij IDE安装目录下的bin/idea.properties, 将其中的idea.max.intellisense.filesize=2500改成大一些,比如idea.max.intellisense.filesi

input 的 size 和 maxlength 的区别

size 属性规定输入字段的宽度. 对于 <input type="text"> 和 <input type="password">,size 属性定义的是可见的字符数.而对于其他类型,size 属性定义的是以像素为单位的输入字段宽度. 由于 size 属性是一个可视化的设计属性,我们推荐您使用 CSS 来代替它. 输入框只显示size个可见的字符,但你可以输入'无数'多字符内容. maxlength 属性规定输入字段的最大长度,以字符个数计

Oracle启动时提示map size mismatch; abort

今天在DELL服务器的Redhat 6.4上安装Oracle10.2.0.4,用sqlplus 登陆数据库,会出现如下的提示: map size mismatch; abort: Success,不过其他的功能都正常,只是有这个提示 解决方法: alter system set "_enable_NUMA_optimization"= false scope=spfile; alter system set "_db_block_numa"=1 scope=spfi

六:inputSplit分片size控制map数目

在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数.除了设置固定的每个节点上可运行的最大map个数外,我们还需要控制真正执行Map操作的任务个数. 1.如何控制实际运行的map任务个数 我们知道,文件在上传到Hdfs文件系统的时候,被切分成不同的Block块(默认大小为64MB).但是每个Map处理的分块有时候并不是系统的物理Block块大小.实际处理的输入分块的大小是根据InputSplit来设定的,那么InputSplit是怎么得到的呢? InputSplit=Math