首页 > 编程语言 >C++面试八股文:了解sizeof操作符吗?

C++面试八股文:了解sizeof操作符吗?

时间:2023-06-09 23:23:36浏览次数:36  
标签:面试官 八股文 int C++ char 对齐 sizeof 师兄

某日二师兄参加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++!(狗头)

标签:面试官,八股文,int,C++,char,对齐,sizeof,师兄
From: https://www.cnblogs.com/binarch/p/17470486.html

相关文章

  • [Week 20]每日一题(C++,图论,数学,搜索)
    目录T1[Daimayuan]Collision(C++,多源最短路)题目描述输入描述输出描述样例输入1样例输出1样例输入2样例输处2数据范围解题思路T2[Daimayuan]农田划分(C++,数学,BFS)题目描述题目输入题目输出样例输入1样例输出1样例输入2样例输出2数据范围解题思路T3[Daimayuan]三段式(C++,数组前缀......
  • c++ faq (1-5)
    IS2120.BG57IV3/*#IH//z2013-04-2723:55:54IS2120@BG57IV3.T4259468281.K-----------------------------------++0.ID&Desc:-------------------------------------------------------------------------------+1.读后文摘,每天看点儿,随手记录下。+1.Todo:-----......
  • c++ book (IS2120@BG57IV3)
    //z2013-04-1513:20:[email protected][T424,L5832,R188,V6844]ReferenceStyle-AllLevelsTheC++ProgrammingLanguage(BjarneStroustrup)(soontobeupdatedforC++11)TheclassicintroductiontoC++byitscreator.Writtentoparallelthe......
  • c++中的位操作
    c++中的位操作使用or设置位 number|=1<<x;将设置位x清除位使用位操作&清除位。 number&=~(1<<x);这将清除位x。转换位XOR操作(^) number^=1<<x;检查位 bit=number&(1<<x);......
  • 在 c++ 中删除一个 NULL pointer (空指针)
    @is21201.在c++中删除一个NULLpointer(空指针)是安全的2.标准中相关内容如下:"Ineitheralternative,ifthevalueoftheoperandofdeleteisthenullpointertheoperationhasnoeffect."3.一个有用的宏@is2120#definemy_delete(x){deletex;x=NULL;} 4......
  • c++ 书籍推荐
    对于所有人都适用-参考手册   TheC++ProgrammingLanguage(BjarneStroustrup)   C++StandardLibraryTutorialandReference(NicolaiJosuttis)   TheC++IOStreamsandLocales(AngelikaLangerandKlausKreft)入门级   C++Primer†(Stanle......
  • 全网八股文面试高频题目--JAVA基础
    八股文--JAVA基础目录八股文--JAVA基础1.JDK、JRE、JVM有什么区别1.1Java为什么被称为平台无关性语言?2.常用数字类型的区别3.Float在JVM的表达方式及使用陷阱4.面向对象三个特性是什么4.1重载和重写的区别?4.2Java中是否可以重写一个private或者static方法?4.3构造方法有哪些......
  • google c++ 风格指南
    这是google给c++开源项目提出的规范。不得不说,里面有很多知识点,能让c++编写者避开某些坑位。但同时它非常的学术,看的有点恶心。翻译后网址:https://www.bookstack.cn/read/google-cpp-style/1.md原文网址:https://google.github.io/styleguide/cppguide.html#Use_of_constexpr......
  • C# 调用C++库引发不得不说的事
    第三方引用库使用方式有两种1.动态库(DLL),2.静态库(Lib)区别:        静态库:我们的程序在链接时会把用到的静态库全部都链接进去,形成一个exe,这也导致我们的exe很大(程序是先编译,再链接库,最后形成exe)        动态库:是在不再把整个库都链接进去,而是程序用到哪个库,......
  • 定义 C++ 对象
     类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类Box的两个对象:BoxBox1;//声明Box1,类型为BoxBoxBox2;//声明Box2,类型为Box对象Box1和Box2都有它们各自的数据成员。https://www.lekaowang.c......