某日二师兄参加XXX科技公司的C++工程师开发岗位第10面:

面试官:了解sizeof操作符吗?

二师兄:略微了解(不就是求大小的嘛。。)

面试官:请讲以下如何使用sizeof

二师兄:sizeof主要是求变量或者类型的大小。直接使用sizeof(type)sizeof(var)即可。

面试官:嗯。sizeof(int*)sizeof(int**)sizeof(int[4])各返回什么?

二师兄:前两者的返回值相等。在32位操作系统中返回4,64位操作系统中返回8。sizeof(int[4])返回16,是因为sizeof运算时数组不会退化为指针。

面试官:如果一个int* p = nullptr,那么对其进行sizeof(*p)会发生什么?

二师兄:返回4。原因是sizeof在编译时求值,sizeof只需要获取*p的类型,并不对*p求值。所以不会发生段错误。

面试官:下面三个szieof运算符,各返回什么?

#include <iostream>
#include <string>
int main(int argc, char const *argv[])
{
const char* str1 = "hello";
char str2[] = "hello";
std::string str3 = "hello";
std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;
std::cout << sizeof(str3) << std::endl;
}

二师兄:第一个返回4或8,因为它是个指针,第二个是个数组,不过末尾有个\0结束符,所以它的值是6,第三个不清楚,但是等于sizeof(std::string)

面试官:好的。使用sizeof对以下两个结构体求大小,

#include <iostream>
struct Foo
{
char c;
int i;
double d;
};
struct Goo
{
char c;
double d;
int i;
}; int main(int argc, char const *argv[])
{
std::cout << sizeof(Foo) << std::endl;
std::cout << sizeof(Goo) << std::endl;
}

二师兄:sizeof(Foo)应该等于16,而sizeof(Goo)应该等于24。因为需要内存对齐。

面试官:好的。那你知内存对齐的原则是什么,为什么要内存对齐?

二师兄:额。。。应该需要以8位对齐吧。。。不是很清楚为什么要内存对齐。

面试官:你知道sizeof(空结构体)的结果是多少吗?

二师兄:应该是0吧。

面试官:对只有一个函数的类进行sizeof运算结果是多少?

二师兄:应该也是0?

面试官:好的,回去等通知吧。

让我们复盘以下今日二师兄的表现。

内存对齐的原则是什么,为什么要内存对齐?

主要有以下原则:

  1. 结构体变量的首地址是其最宽基本成员类型大小的整数倍。
  2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍。
  3. 结构体的总大小为结构体最宽基本成员类型大小的整数倍。

因为性能。为了缓存友好(Cache friendly)。这是一个很大的话题,咱们今天聊不了太多。

sizeof(空结构体)的结果是多少?

这里在C中是0,在C++中是1。C++标准规定,不同的对象不能拥有相同的内存地址。 如果空类大小为0,类的对象数组中的每个对象都拥有了相同的地址,这显然是违背标准的。

对只有一个函数的类进行sizeof运算结果是多少?

这里也是一个坑。要看这个函数是不是虚函数。如果不是虚函数,则结果是1,如果是虚函数,则大小是4或者8。

聪明的小伙伴,提到4或者8.就应该知道是怎么回事了吧?

好了,今日份面试到这里就结束了,小伙伴们,对于今天二师兄的面试,能打几分呢?如果是你,以上的问题都能回答的上来吗?

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:了解sizeof操作符吗?的更多相关文章

  1. C++ sizeof操作符的用法和strlen函数的区别

    摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...

  2. C语言strlen函数和sizeof操作符

    字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...

  3. 字符串 前篇 ---- sizeof()操作符和strlen()库函数

    本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...

  4. sizeof操作符-结构体与类大小

    导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...

  5. C++中sizeof操作符与strlen函数

    sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...

  6. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  7. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  8. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  9. C++面试中关于sizeof问题总结

    原文:http://blog.sina.com.cn/s/blog_7c983ca60100yfdv.html#SinaEditor_Temp_FontName (1)      sizeof是操作符 ...

  10. c/c++面试12-18------关与sizeof那些事儿

    12 使用sizeof计算普通变量所占空间大小 (1)不同数据类型所占字节数不同(32位 64位系统不同) int----->4 double----->8 char-------> ...

随机推荐

  1. 原型继承和 Class 继承

    涉及面试题: 原型如何实现继承? Class 如何实现继承? Class 本质是什么? ⾸先先来讲下 class ,其实在 JS 中并不存在类, class 只是语法糖,本质还是函数. class P ...

  2. NLP 开源形近字算法之相似字列表(番外篇)

    创作目的 国内对于文本的相似度计算,开源的工具是比较丰富的. 但是对于两个汉字之间的相似度计算,国内基本一片空白.国内的参考的资料少的可怜,国外相关文档也是如此. 本项目旨在抛砖引玉,实现一个基本的相 ...

  3. Redis集群介绍及测试思路

    作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...

  4. [Linux]网络检测工具之iperf

    1 安装网络检测工具 iperf step1.0 iperf的简介 [摘] iperf是一种命令行工具,用于通过测量服务器可以处理的最大网络吞吐量来诊断网络速度问题.它在遇到网络速度问题时特别有用,通 ...

  5. [Python]【Form Data vs Request Payload】之 python 爬虫如何实现 POST request payload 形式的请求

    1 问题描述 欲使用Python的requests库(requests.session().request(...))实现对此Ajax的POST请求进行模拟实现. 但在chrome发现其请求的形式不一 ...

  6. 粘包,自定义协议,struct模块,粘包解决终极大招

    粘包: 1.粘包问题出现的原因: (udp不会出现粘包问题) 1.1.tcp是流式协议,数据像水流一样黏在一起,没有任何边界区分 1.2.收数据没收干净,有残留,就会下一次结果混淆在一起去(客户端接受 ...

  7. day07-OpenFeign-服务调用

    SpringCloud OpenFeign-服务调用 1.OpenFeign介绍 https://github.com/spring-cloud/spring-cloud-openfeign Open ...

  8. 从源码角度分析ScheduleMaster的节点管理流程

    ScheduleMaster是一个开源的分布式任务调度系统,它基于.NET Core 3.1平台构建,支持跨平台多节点部署运行. 项目主页:https://github.com/hey-hoho/Sc ...

  9. 【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播

    0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发,做了各种各样的小工具小Demo,AI工具用起来是真的香!在他们的影响下,我也继续捣鼓GPT Demo,希望更多的开发者加入一起多多交流. 上一篇 ...

  10. [C++核心编程] 1、内存分区模型

    文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后 1.3 new操作符 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进 ...