S_local_capacity + 1]; size_type _M_allocated_capacity; }; }; 其中size_type的等价于size_t,64位机器上是8字节...,指针也是8字节.因此,上述我们可以知道内存结构为 8字节内存指针 8字节字符串长度 匿名的enum,并没有用一个枚举去声明一个名,不占内存. 16字节联合体 故string内部按8字节对齐,共占32字节大小.... 2.解析答案 现在回到上面那个问题上: 结构体A的内部结构通过上述的string,我们知道如下: 4字节int 8字节long 32字节string 而32字节又可以被展开为: 8 8 16 根据...string我们知道是8字节对齐,据此得出A为8字节对齐. int+long为12,需要填补到8的倍数边界,故为16,而string为32,不用变,因此最后为16+32=48....拓展:在一个类中声明一个enum或者结构体,只要没有定义是不占大小的.而union只出现了,就会占大小.例如: class A{ private: class B { int a
1.对于C++中的类的内存占用,存在一个很容易出现错误的点。...没错,结果并不是0而是1,这个没有定义任何成员变量也没有定义任何的虚函数的类占用的是一个字节内容。...因为对于没有数据成员的对象,其内存单元也不是0,c++用一个内存单元来表示这个实例对象的存在。 2.C++中的类的内存对齐方式,到底是以几个字节作为对齐标准呢?4个?8个?又或者是更多呢?...C++中的类的对齐的字节,并不是一个定数,而是以类中的成员变量占用的字节数最大的类型作为对齐标准的。...因为这个就和第一个易错点有联系了,因为现在这个类内部并没有定义有成员数据,c++用一个内存单元来表示这个实例对象的存在,这一个内存字节,因为存在虚函数表(4个字节),所以经过内存对齐之后,这个类所占用的内存大小就是
空类 class Empty { } 空类包含的函数(6个) class Empty { public: Empty(); // 缺省构造函数// Empty( const Empty& ); // 拷贝构造函数
因此,如果一个类没有任何成员变量,而只有成员函数,我们称之为空类。这种空类的对象大小在C++中也是有规定的。 空类对象的大小 尽管空类没有成员变量,但在C++中,空类的对象大小仍然不是零。...空类的对象大小是1字节。这是因为C++规定每个类的对象都必须占有唯一的地址,即使类中没有成员变量。这1字节的大小用于确保不同的对象在内存中拥有唯一的地址。 为什么空类对象占1字节?...结论: 空类对象的大小是1字节,即使类中没有成员变量,C++仍然会为每个空类对象分配1字节的空间,以确保每个对象有唯一的内存地址。...运行时崩溃 详细解释:为什么不是空指针访问 在这两个测试题中,关键点在于是否访问了成员变量: 测试题 1 中,Print() 函数没有访问成员变量,所以即使 this 是空指针,C++也不会触发空指针访问错误...这是因为 int 变量 _i 要求4字节对齐,而 char 只占1字节,因此在 char 后面会插入3个字节的填充空间,以便 int 对齐到4字节边界。 拓展解释:为什么需要内存对齐?
随后我们通过空指针 p->Print() 来调用成员函数 Print(),这里的 this 指针其实是空指针。 为什么不会报错?...运行时崩溃 详细解释:为什么不是空指针访问 在这两个测试题中,关键点在于是否访问了成员变量: 测试题 1 中,Print() 函数没有访问成员变量,所以即使 this 是空指针,C++也不会触发空指针访问错误...这是因为 int 变量 _i 要求4字节对齐,而 char 只占1字节,因此在 char 后面会插入3个字节的填充空间,以便 int 对齐到4字节边界。 拓展解释:为什么需要内存对齐?...解释 通过使用 #pragma pack(1) 指令,我们将类 B 的内存对齐设置为 1 字节对齐。...这样,char 类型占用 1 字节,int 类型占用 4 字节,总共5字节,没有插入额外的填充字节。
福哥答案2020-09-30:#福大大架构师每日一题# 2020-09-30:谈谈内存对齐,如何回答呢? 2020-09-30:谈谈内存对齐。 一、为什么需要内存对齐? 1.平台。 2.性能。...二、各种语言的内存对齐规则如下: 1.C++: 空类的内存大小为1字节。继承n个空类,内存大小是n-1个字节。 规则如下: 1)第一个成员在与结构体偏移量为0的地址处。...4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 2.Java: 空类的内存大小为16字节。...final zero field:结构体里的最后一个属性如果是空结构体,会当成1个字节处理。如果结构体嵌套的全是空结构体,还是0个字节。 规则跟c++一样,64位下默认对齐数是8。...4.rust: 空结构体的内存大小为0字节。 结构体规则跟c++一样。64位下默认对齐数是8。 5.c#: 空结构体的内存大小为1字节。 结构体规则跟c++一样。64位下默认对齐数是8。
可以通过类来对数据结构进行分类,比如汽车类,它是交通工具类的一个特例,后者是更广泛的类。 可以在软件中定义一个汽车类Car和交通工具类Vehicle来对这种关系建模。...在软件中,对不同的交通工具重复定义载人能力等方法是没有意义的,只要在Vehicle类定义一次,然后在Car类时,只要声明它继承(或扩展)了Vehicle类的基础定义就行。...Car类的定义就是对通用Vehicle类定义的特殊化。 这里要注意,尽管Vehicle类和Car类都会定义相同的方法,但实例中的数据可能是不同的。比如每辆车的识别码等。...这就可以看出,类的继承和实例化。 类的另一个核心概念是多态,即父类的通用行为可以被子类用更特殊的行为重写。 类实例是由一个特殊的类方法构造的,这个方法名通常和类名相同,被称为构造函数。...js中只有对象,没有类这个概念。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被复制到子类中。 而js并不会像类那样自动创建对象的副本。
) {} }; // 类中什么都没有——空类 class A3 {}; int main() { cout << sizeof(A1)<<" " << sizeof(A2) <<" "<< sizeof...(A3) << endl; return 0; } 运行结果如下: 结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意空类的大小,其中只有成员函数或者空类,这两种情况比较特殊...和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。 结构体怎么对齐? 为什么要进行内存对齐?...(3)为什么要进行内存对齐? ①平台原因(移植原因) 某些编译器不能对任意内存位置进行操作,所以要将数据存储在可被操作的位置。...如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐?
,编译器给了空类一个字节来唯一标识这个类的对象 类的成员函数不占用对象内存区,函数的分布位置为代码区,同一个类实例化的所有对象共享相同的函数。...如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍 面试题: 结构体怎么对齐? 为什么要进行内存对齐?...在C++中,类(class)的成员变量在内存中的布局需要遵循内存对齐规则,主要是出于以下几个关键原因: 性能优化:(主要原因) 访问未对齐的内存地址在某些硬件架构上可能导致性能下降。...如果一个4字节的数据没有按照4字节对齐,处理器可能需要执行两次内存访问操作来获取完整的数据,这无疑会降低程序运行速度。...因此,在C++中编译器默认会对类的成员变量进行内存对齐,当然也可以通过预定义的编译器宏(如#pragma pack)或者显式指定成员变量的对齐方式来控制类的内存布局。
类中仅有成员函数 class A2 { public: void f2() {} }; 类中什么都没有---空类 class A3 {}; 对于类 A2 和 A3,它们没有成员变量,只有成员函数...如前所述,成员函数不占用类实例的内存空间。然而,对于空类,编译器通常会为其分配至少一个字节的大小,以确保每个对象在内存中都有一个唯一的地址。...结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。 结构体内存对齐规则 1....为什么要进行内存对齐?:如上所述,内存对齐可以提高处理器访问内存的效率,并避免在某些硬件平台上出现错误。 如何让结构体按照指定的对齐参数进行对齐?...未定义行为意味着 C++ 标准没有规定在这种情况下程序应该如何表现。不同的编译器、不同的编译器设置、不同的操作系统或硬件架构都可能导致不同的结果。因此,我们应该始终避免通过空指针调用成员函数。
内存对齐规则保证了访问效率(见下文解释)。 2.3 对象大小:空类情况 在C++中,对象的大小是由类的成员变量决定的,而类的成员函数不会影响对象的大小。...因此,如果一个类没有任何成员变量,而只有成员函数,我们称之为空类。这种空类的对象大小在C++中也是有规定的。 空类对象大小 尽管空类没有成员变量,但在C++中,空类的对象大小仍然不是零。...空类的对象大小是1字节。这是因为C++规定每个类的对象都必须占有唯一的地址,即使类中没有成员变量。这1字节的大小用于确保不同的对象在内存中拥有唯一的地址。 为什么空类对象占1个字节?...结论: 空类对象的大小是1字节,即使类中没有成员变量,C++仍然会为每个空类对象分配1字节的空间,以确保每个对象有唯一的内存地址。...运行时崩溃 详细解释:为什么不是空指针访问 在这两个测试题中,关键点在于是否访问了成员变量: 测试题 1 中,Print() 函数没有访问成员变量,所以即使 this 是空指针,C++也不会触发空指针访问错误
,虽然限定了类有那些成员,但是没有实际分配空间。...不将成员函数算入类内存中,而是将类成员函数存储在公共代码区空类比较特殊,编译器给空类一个字节来唯一标识这个类的对象,表示这个对象存在过,可能有成员函数。...在结构体中,成员的内存对齐是由编译器决定的,通常会按照平台和编译器的规则进行对齐2.为什么内存对齐内存对齐是为了提高内存访问效率和系统性能的。...外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传3.如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、即任意字节对齐?...在C++11中,可以在空对象(即没有分配内存的对象,匿名对象)上调用成员函数,但这并不意味着**this**指针是**NULL**。
编译器给了空类一个字节来唯一标识这个类的对象。 三 . 结构体内存对齐规则(面试题) 第一个成员在与结构体偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。...为什么要进行内存对齐? (1).如上:结构体内存对齐规则; (2). 1. 硬件要求:不同的硬件平台对于特定数据类型的访问有特定的内存对齐要求。 2. ...在C++中,结构体可以按照指定的对齐参数进行对齐,但直接指定对齐字节数的方式并不直接支持。 三.什么是大小端?...如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景 大小端是指计算机存储数据时字节的顺序方式,分为大端模式(Big-endian)和小端模式(Little-endian)。...2. this指针可以为空吗? 可以
因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。...实现 Serializable接口的作用就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没有序列化,怎么才能进行网络传输呢?要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化。
空类或者只有成员函数的类会有1个字节的占位大小,仅仅只用来标记该类存在。...void f2() {} }; // 类中什么都没有---空类 class A3 {}; 结论:一个类的大小,实际就是该类中 ” 成员变量 ” 之和,当然要注意内存对齐 注意空类的大小,空类比较特殊...,编译器给了空类一个字节来唯一标识这个类的对象。...为什么要进行内存对齐? 平台(移植性)原因: 不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况。...如何让结构体按照指定的对齐参数进行对齐?能否按照 3 、 4 、 5 即任意字节对齐?
当然这里也遵循内存对齐原则。...class A1 {//占四个字节 public: void f1() {} private: int _a; }; // 类中仅有成员函数 class A2 {//占一个字节 public...: void f2() {} }; class A3 {}; 空类的大小:空类占1个字节,占位用,告诉系统我这里定义了一个类,虽然它是空的。...结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。...而且去公共代码区访问的Display(),这是为什么呢? 这是因为C++在这段代码中做出手脚,C++在这里增加了一个this指针,这里是因为Display会增加一个this形参。
这是为什么呢?...A类包括了一个char类型变量和一个函数,char类型我们知道占用一个字节,但是对于函数来说,C语言中的结构体并没有这种成员,因此,我们需要对其进行分析。...那么我们知道,函数一般在别的地方都是以函数名出现的,函数名代表着地址,地址是四个字节,如果按照这样的思路来计算的话,根据内存对齐的规则,得出A类的大小就是八个字节,那么 结果真的是这样吗?...注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。...为什么要进行内存对齐? 如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐? 什么是大小端?
如果后面没有访问限定符,作用域就到 } 即类结束。...5. class的默认访问权限为private,struct为public(因为struct要兼容C) 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别 C++ 中 class...对象占用的大小 只考虑成员变量 也不考虑其私有还是公有 注意 : 空类大小是 1 这一个字节不存储有效数据 只是用来标识对象被定义出来 7.2 结构体内存对齐规则 1....,因为静态成员函数没有this指针,只有非静态成员函数才有,且为隐藏指针. 5、this可以为空,单纯的对this赋空是不可以的,不过可以强转直接赋空,不过一般不进行这样的操作 1. this指针存在哪里...2.this关键字只能用于成员函数,不能用于被static修饰的函数(静态函数),因为静态成员函数没有this指针,它们仅能访问静态数据成员和静态成员函数 3.在C++中,this关键字是一个指向对象自己的一个指针
某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题: VC++里,有一个空类,没有声明任何成员变量或函数,请问此空类占多大字节空间?...,因此选了C和D 后又想想,这没有操作指针,也就不需内存对齐(视VC++编译器会自动进行对齐优化),排除了C和D,选择了A 当时也考虑过侯捷老师译著的那本《深度探索C++对象模型》,C++中继承与多态在编译器中是如何区分的...我贴出测试代码: #include using namespace std; // 空类 class ClassA { }; // 继承空类的空类 class ClassB :...(重载类似)后,现在我们回到正题——sizeof(空类或空结构体)= 1 空类,没有任何成员变量或函数,即没有存储任何内容; 但是由于空类仍然可以实例化,即 ClassA A; cout<<"sizeof...(A): "<<sizeof(A)<<endl; 一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址 这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少
前言 为什么C++要学习类?学习C++中的类是掌握面向对象编程的关键。类提供了将数据与操作封装在一起的结构化方式,帮助开发者解决复杂问题、提高代码的可重用性和安全性。...类的大小与类中包含的数据成员、继承关系、对齐方式以及可能的填充字节(padding)等因素有关。C++中的 sizeof 运算符可以用来计算类对象的大小。...7.2 对齐和填充 C++中大多数系统对内存有特定的对齐要求,通常是 2、4 或 8 字节。...这意味着类的实际大小可能是 8 字节而不是 5 字节。 7.3 空类的大小 在C++中,即使类中没有任何成员变量,空类的大小也不是 0。...为了确保每个对象都有唯一的地址,C++规定空类的大小为 1 字节。
领取专属 10元无门槛券
手把手带您无忧上云