MST
星途 面试题库

面试题:C++ 空类模板与复杂内存布局分析

考虑一个模板类template <typename T> class EmptyTemplate { }; 当T分别为int、自定义空类、自定义含有虚函数的类时,实例化后的EmptyTemplate类的内存布局和大小是怎样的?分析编译器在处理这些情况时的优化策略以及背后的C++标准规范。
23.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. T为int时

    • 内存布局:由于EmptyTemplate<int>本身没有数据成员,它在内存中没有实质占用额外空间来存储数据。
    • 大小:在C++中,一个空类实例化后通常大小为1字节(为了确保每个实例在内存中有唯一地址)。但EmptyTemplate<int>可能由于模板的特殊性,某些编译器优化后大小仍为1字节。这是因为虽然它没有实际数据成员,但需要占用一定空间以保证其存在于内存中有唯一标识。
    • 编译器优化策略:编译器可能会利用空基类优化(EBO,Empty Base Optimization)的概念(虽然这里不是严格的继承情况,但类似思路),不会为其分配额外用于存储数据的空间,仅保留最小空间用于标识实例。
    • C++标准规范:C++标准规定,一个类的对象大小必须至少为1字节,以确保每个对象在内存中有唯一地址。
  2. T为自定义空类时

    • 内存布局:同样,EmptyTemplate<自定义空类>本身没有数据成员,自定义空类也没有数据成员。
    • 大小:按照C++标准,大小至少为1字节。编译器可能优化为1字节,因为它没有实质数据需要存储,仅需满足对象有唯一内存地址的要求。
    • 编译器优化策略:编译器会基于空类没有数据成员的特点,不分配额外空间用于存储数据,仅确保有1字节空间用于标识实例。
    • C++标准规范:与上述情况一样,标准要求类对象大小至少为1字节以保证唯一性。
  3. T为自定义含有虚函数的类时

    • 内存布局EmptyTemplate<自定义含有虚函数的类>本身无数据成员,但自定义含有虚函数的类会有一个虚函数表指针(vptr)。在内存中,对象首先存储vptr,指向虚函数表。
    • 大小:大小通常为虚函数表指针的大小,在32位系统上一般为4字节,64位系统上一般为8字节。这是因为要存储指向虚函数表的地址。
    • 编译器优化策略:编译器会确保为虚函数表指针分配空间,用于动态绑定虚函数。不会进行减少该指针空间的优化,因为这是实现多态性的关键部分。
    • C++标准规范:C++标准规定,含有虚函数的类必须有一个机制(通常是虚函数表指针)来实现动态绑定,因此编译器必须为其分配足够空间来存储这个指针。