常问面试题:C++中sizeof的陷阱及应答

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
C++中sizeof是经常被问到的一个概念,比如,下面的几个关于sizeof的面试题反复出现在各大IT公司的技术面试当中,我们有必要完全理解并掌握。
注:在曾经面试大公司时,我的确被问到过这样的问题。

面试题:定义一个空的数据类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?
答案:是1,为什么不是0?空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例时,它必须在内存中占有一定的空间, 否则无法使用这些实例(也就不能求sizeof了),至于占用多少内存,由编译器决定,Visual Studio中每个空类型的实例占用1字节的空间。

扩展1:如果在该类型中添加一个构造函数和析构函数,再求sizeof,得到的结果是多少?
答案:还是1。调用构造函数和析构函数只需要知道函数的地址即可,而这些地址只与类型相关,而与类型的实例无关, 编译器也不会因为这两个函数而在实例内添加任何额外的信息
注:不管添加的是构造函数还是析构函数还是其它任何类型的函数,都是这个结果。

扩展2:那如果把析构函数标记为虚函数呢?
答案:C++的编译器一旦发现一个类型中有虚函数 ,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针,在32位机器上,一个指针占4字节空间,因此求sizeof得到4;如果是64位则为8。

测试用例:
  1. #include <stdio.h>  
  2.   
  3. struct nullType { };  
  4.   
  5. struct type1   
  6. {  
  7.     type1() {}  
  8.     ~type1() {}  
  9.     int print() { printf("Alexia"); return 0; }  
  10. };  
  11.   
  12. struct type2   
  13. {  
  14.     type2() {}  
  15.     virtual ~type2() {}  
  16. };  
  17.   
  18. int main()   
  19. {  
  20.     printf("sizeof(nullType) = %d\n"sizeof(nullType));  
  21.     printf("sizeof(type1) = %d\n"sizeof(type1));  
  22.     printf("sizeof(type2) = %d\n"sizeof(type2));  
  23.   
  24.     return 0;  
  25. }  


摘选自:剑指offer
C++ STL高频面试题精讲:从容器原理到实战避坑指南 C++标准模板库(STL)是泛型编程高效数据结构的核心实现,理解其底层原理是提升编程能力面试表现的关键。STL通过容器、迭代器、算法函数对象四大组件,实现了数据与操作的分离,其价值在于提供了一套通用、高效且类型安全的代码复用方案。在工程实践中,STL广泛应用于需要快速开发、高性能计算数据管理的场景,例如游戏引擎、高频交易系统大型基础软件。本文聚焦于STL中的高频考点,特别是vector的动态扩容机制迭代器失效问题,这些是面试中区分候选人理解深度的核心。通过剖析容器底层实现(如红黑树与哈希表)、算 阅读详情

相关推荐

C++安全面试核心考点解析:从内存管理到漏洞防御实战

内存管理指针操作是C++编程中的基础概念,其核心原理在于程序运行时对内存间的直接控制与访问。理解内存布局、生命周期边界检查,是构建健壮软件的技术基石,尤其在涉及系统底层操作时至关重要。从技术价值看,掌握这些原理能有效预防缓冲区溢出、野指针解引用等常见漏洞,这些漏洞常被攻击者利用实施远程代码执行或信息窃取。在应用场景上,无论是安全研发、漏洞挖掘还是逆向工程,对C++内存安全机制的深刻理解都是识别修复安全缺陷的关键。例如,在应对**缓冲区溢出****虚函数表攻击**时,开发者需结合编译器的栈保护、地址

weixin_33922670的博客 406

C++面试-sizeof

这个文章对C++中类的不同场景下sizeof的知识点的考察。 当然如果对C++ Object Model比较熟悉的话,这个知识点是小意思咯 :)

堆与栈内存管理详解:从原理到实战解决内存溢出与性能问题

内存管理是编程语言的核心基础,它决定了程序的性能、稳定性资源利用效率。其核心原理在于如何高效地组织管理程序运行时的数据存储,主要涉及两种基本模型:栈(Stack)堆(Heap)。栈采用后进先出(LIFO)机制,自动管理函数调用局部变量,分配与回收速度极快,是线程私有的工作区。堆则用于动态分配生命周期不确定的对象,需要垃圾回收器(GC)或手动管理,容量大但访问相对较慢,且为线程共享。理解这两种模型的技术价值在于,它能从根本上解释程序崩溃(如StackOverflowErrorOutOfMemoryE

weixin_30598225的博客 332

【常见面试题总结之C++sizeof问题】

归纳一些常见面试题C++sizeof是经常被问到的一个概念,比如,下面的几个关于sizeof面试题反复出现在各大IT公司的技术面试当中,我们有必要完全理解并掌握。 【HR】:定义一个类型,里面没有任何成员变量成员函数,对该类型sizeof得到结果是多少? 【acmer】:答案是1。 【HR】:为什么不是0? 【acmer】:类型的实例中不包括任何信息,本来sizeof

herongwei 的 BLOG 1836

sizeof() 面试题及其解析

sizeof()函数详解

am_i_ego的博客 916

sizeof 常用的面试题

1 #include   2    3 int main()   4 {   5     int a = 0;   6     char b[] = "hello world";   7     char c[] = "";   8     char *p = 0;   9     char *q = b;  10     char

barry_yan 790

精通C语言-sizeof-面试题4

func是一个函数指针,跟其余的指针是一样的,都是在64位系统中是8个字节,32位系统中为4个字节。在所有的系统中,函数名的sizeof的结果都是1个字节。以上,sizeof的面试相关的问题都整理完了,后续有更新会再加进来,如果把所有4篇的内容都看完了之后,应该是能覆盖所有的sizeof相关问题了。

ren1198733352的博客 322

C++面试题 sizeof

一、 sizeof    a. 类型sizeof是多大呢? #include #include using namespace std; struct A{}; class B{}; int main(){   struct A *ptra = (struct A *)malloc(sizeof(struct A));   B *ptrb = new B();   struct

htjacky的专栏 590

sizeof与strlen区别详解:C++面试必备知识点与实战解析

通过char arr[] = "Hello"char *p = "World"两组变量测试发现:sizeof(arr)得到6(包含'\0'),而sizeof(p)得到指针大小(4或8字节);strlen对两者都返回可见字符数5。sizeof是编译时确定的运算符,像一把静态尺子直接测量数据类型或变量占用的内存字节数,而strlen是运行时执行的库函数,需要逐个字符扫描直到遇到'\0'结束符。例如包含charint的结构体,在32位系统可能占用8字节而非预期的5字节,这种特性直接影响内存敏感型程序的设计。

SapphireFox89的博客 736

C++ 从 0 入门(六)|C++ 面试必知:运算符重载、异常处理、动态内存进阶(终极补充)

本文是C++面试进阶补充,聚焦运算符重载、异常处理动态内存三大高频考点。详细讲解了运算符重载的语法规则常用实现(包括成员函数友元函数重载),异常处理的try-catch-throw机制及其应用场景,以及动态内存管理中new/delete与智能指针的使用对比。文章提供了完整的可运行代码示例,并针对面试常见问题给出标准答案,帮助读者掌握这些能"拉开差距"的进阶知识点,提升C++面试竞争力。特别强调智能指针在避免内存泄漏中的重要作用,以及运算符重载异常处理的面试应答技巧。

2301_81120700的博客 510

深入C++与QT高频面试题(不定时更新)

本文总结了C++、数据库Qt相关的常见面试题,涵盖以下核心内容: C++特性与智能指针 智能指针(unique_ptr/shared_ptr/weak_ptr)解决内存管理问题 构造函数/析构函数特性,虚函数与纯虚函数区别 STL容器分类与特性(vector/list/set/map等) 多线程编程 线程创建方式(Thread类/moveToThread) 线程同步机制(互斥锁/条件变量/读写锁) 进程间通信方式(管道/共享内存/消息队列) 数据库基础 事务ACID特性与操作流程 索引原理与使用场景 关系

阿博的博客 1215

C++面试中TCP协议核心知识问答

C++面试中,TCP协议是高频考察点,尤其在高性能服务器、分布式系统等领域。面试官通过TCP相关问题,不仅考察候选人对网络协议的理解,更关注其将理论转化为高效C++代码的能力。以下从基础特性、编程实践、性能调优到进阶知识,以问答形式展开核心考点。

码事漫谈 1138

C语言词法陷阱解析:从最大贪心法到面试实战避坑指南

词法分析是编译器处理源代码的第一步,它决定了代码如何被解析成有意义的符号序列。在C语言中,词法规则如“最大贪心法”要编译器从左到右组合最长的有效符号,这直接影响了运算符解析表达式值。理解词法原理对于编写无歧义、健壮的代码至关重要,能有效避免未定义行为潜在的安全漏洞。在实际开发中,词法陷阱常导致缓冲区溢出、整型截断等问题,尤其在系统编程安全性要高的场景下更为关键。掌握字符与字符串的本质区别、整型常量的进制陷阱以及注释的吞噬效应,是提升代码质量的基础。本文聚焦C语言词法缺陷,深入剖析最大贪心法、字符

weixin_34296641的博客 325

C++面试核心考点与实战解析

C++作为系统级编程语言的核心竞争力在于其高效的内存管理丰富的语言特性。从编译原理角度看,指针与引用机制直接影响对象内存布局,而虚函数表(vtable)则实现了运行时多态这一面向对象关键特性。在工程实践中,STL容器的选择直接影响算法效率,比如vector的2倍扩容策略与map的红黑树结构都需要深入理解。现代C++特性如智能指针通过RAII机制自动管理资源,结合移动语义显著提升性能。这些技术广泛应用于高频交易、游戏引擎等对性能敏感的领域,也是面试考察的重点方向。掌握这些核心概念不仅能应对技术面试,更能提升

weixin_34357887的博客 372

C++研发面试核心能力构建:从语言基础到系统设计实战指南

在软件研发领域,扎实的编程语言基础高效的问题解决能力是工程师的核心竞争力。C++作为一门高性能的系统级语言,其核心在于对内存管理、对象生命周期底层机制的精准控制。理解这些原理不仅能提升代码性能,更是构建稳定、可靠系统的技术基石。从数据结构与算法的灵活运用,到并发编程、网络通信等系统级技术的实践,这些能力共同支撑起现代后端服务、游戏引擎、高频交易等高性能应用场景。本文聚焦C++研发岗位的深度考察,通过剖析智能指针、RAII资源管理等关键热词,以及多线程编程、内存模型等高频技术点,为你梳理从概念理解到工程实

weixin_34221332的博客 419

ZeroMQ高性能网络编程与C/C++优化实战指南

网络通信是分布式系统的基础,其核心在于高效、可靠的数据传输。消息队列作为解耦系统组件、实现异步通信的关键技术,通过预定义的通信模式简化了复杂网络编程。在底层实现中,零拷贝机制通过避免不必要的数据复制,显著提升了传输效率,尤其适合高吞吐场景。结合C/C++语言特性,开发者可以进一步优化内存管理并发模型,例如通过自定义内存池减少动态分配开销,利用多线程与无锁数据结构提升处理能力。这些优化手段在金融交易、实时游戏、物联网等对延迟敏感的应用场景中价值显著。本文以ZeroMQ为例,深入探讨如何将其零拷贝特性与C/C

weixin_33778544的博客 419

大华C++后端开发面试复盘:多态、TCP粘包与智能指针深度解析

C++作为高性能系统开发的核心语言,其多态机制通过虚函数表(vtable)实现运行时动态绑定,是面向对象编程的基石。理解其内存布局与动态绑定原理,对于编写高效、可扩展的代码至关重要。在网络编程领域,TCP作为面向字节流的传输层协议,其无消息边界的特性导致了粘包与拆包问题,这需要开发者在应用层设计协议(如TLV格式)来界定数据边界,确保可靠通信。在并发编程中,智能指针(如shared_ptr)通过引用计数自动管理对象生命周期,但其线程安全性需分层面看待:控制块操作是原子的,而所指对象的访问仍需额外同步。这些技

weixin_30247307的博客 421
上一篇: 程序员求职面试心经40条——谨记原则
下一篇: 面试题之发散思维能力:如何用非常规方法求1+2+···+n
strongjava
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值