某日二师兄参加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. 把一个列表拆成N个子列表的四种方法

    编程的方法往往不止一种,比如怎么把一个Python种的列表拆成N个子列表,我们可以很容易找到N种方法,也许这就是编程的魅力所在. 一.列表表达式法 这种方法最为简洁,不过可读性差一些 这个方法中,即使 ...

  2. Web前端开发必看的100道大厂面试题

    1. 说说gulp和webpack的区别 开放式题目 Gulp强调的是前端开发的工作流程.我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并.雪碧图.启动server.版本控制 ...

  3. panda之series结构

    eries 结构,也称 Series 序列,是 Pandas 常用的数据结构之一,它是一种类似于一维数组的结构,由一组数据值(value)和一组标签组成,其中标签与数据值之间是一一对应的关系.Seri ...

  4. day93:flask:Cookie&Session&请求钩子&捕获错误&上下文&Flask-Script

    目录 1.HTTP的会话控制 2.Cookie 3.Session 4.请求钩子 5.捕获错误 6.上下文:context 7.Flask-Script 1.HTTP的会话控制 1.什么是会话控制? ...

  5. DeFi-W3

    Gas Fee 每一笔交易都会产生Gas Fee. GWei ETH的最小单位 出价(gas fee)的高低会影响交易上联的速度,越快就价格越高. gas fee是跟具体的计算量有关的 Smart c ...

  6. 如何生成文本: 通过 Transformers 用不同的解码方法生成文本

    简介 近年来,随着以 OpenAI GPT2 模型 为代表的基于数百万网页数据训练的大型 Transformer 语言模型的兴起,开放域语言生成领域吸引了越来越多的关注.开放域中的条件语言生成效果令人 ...

  7. uniapp小程序开发准备工作

    1.下载HbuilderX HBuilderX官网:https://www.dcloud.io/hbuilderx.html 下载正式版--下载完后解压--双击打开HBuilderX.exe文件就可以 ...

  8. Selenium Grid入门详解

    一.简介 Selenium是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器.操作系统和机器上 Selenium Grid主要使用 master-slaves或者hub-no ...

  9. LeetCode 双周赛 103(2023/04/29)区间求和的树状数组经典应用

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 这场周赛是 LeetCode 双周赛第 103 场,难得在五一假期第一天打周赛的人数也没 ...

  10. 从源码深入理解读写锁(golang-RWMutex)

    环境:go 1.19.8 在读多写少的情况下,即使一段时间内没有写操作,大量并发的读访问也不得不在Mutex的保护下变成串行访问,这种情况下,使用Mutex,对性能影响比较大. 所以就要区分读写操作. ...