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

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

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

C++面试八股文:了解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。

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

相关文章

  • 《C++》类和对象2
    初始化列表classPerson{public:Person():a(10),b(20),c(30){cout<<"初始化列表的调用"<<endl;}inta;intb;intc;};静态成员函数程序共享一个函数静态成员函数只能访问静态成员变量#include<iostream>usingnamespacestd;classCompute{public......
  • c++多线程 std::async std::future
    c++标准库中对线程操作有完善的封装,其中最常用到的如std::thread,std::async。EffectiveModernCpp中指出,应尽量使用std::async即基于任务的编程而非基于线程的编程。std::thread在前面的文章有提到过,此处仅对std::async作以记录。正如前面所说,std::async是基于任务的策略,本人理......
  • 【初识C++】(关键字,命名空间)
    @TOC一、C++中的关键字二、命名空间命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。比如:报错的意思是:库中存在rand这个函数,而我又定义一个rand这个变量,所以会产生名字的冲突。为了解决这个问题,C++引入了命名空间这个概念。而与该命名空间的......
  • C++学习(二)
    拷贝构造函数对象1=对象2:默认的拷贝构造函数1#include<iostream>2usingnamespacestd;34structPerson{5intage;6stringname;7};89intmain(){10Personp1={10,"张三"};11cout<<"age:"<<p1.......
  • C++学习(三)
    static静态修饰的变量,必须先声明,再实现,例如1classPerson{2public:3starticintage;4starticinitAge(){5//运行异常6age=10;7}8}91011正确写法12classPerson......
  • C++学习(四)
    对象继承1#include<iostream>2usingnamespacestd;34classPerson{5public:6intage;7char*name;8Person(char*name,intage){}9};10//类默认是私有的11//public:公开继承,不加public会导致main()函数中student.age无法引用......
  • C/C++《数据结构》课程设计指导书[2023-06-15]
    C/C++《数据结构》课程设计指导书[2023-06-15]《数据结构》课程设计指导书适用专业:计算机2022级编写人:李玉龙2023年5月《数据结构》课程设计指导书一、设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;2.初步掌握软......
  • C/C++器材信息管理系统[2023-06-15]
    C/C++器材信息管理系统[2023-06-15]使用C++程序设计语言,完成一个项目,项目名为:器材信息管理系统,要实现的功能如下,且每项功能具有数据校对验证:1、实现新器材的录入,包括器材的名称、录入日期、购买价钱等信息;2、当有器材借用需求时,进行借用登记,主要流程为:查询器材数量,若库存数量大......
  • [问题解决]:ImportError: /home/test/anaconda3/envs/py39/bin/../lib/libstdc++.so.6
    报错(py39)test@test:~/code/Face/test_speed$pythonface_yaw_pitc_roll.pyTraceback(mostrecentcalllast):File"/home/test/code/Face/test_speed/face_yaw_pitc_roll.py",line17,in<module>importdlibFile"/home/test/anacon......
  • 《深入探索C++对象模型》- 第一章 - 关于对象 - 笔记
    额外负担:主要由virtual引起1.1C++对象模式简单对象模型(ASimpleObjectModel)Objectptr1->Data1ptr2->Function1ptr3->Function2ptr4->Data2……表格驱动对象模型(ATable-drivenObjectModel)ObjectDatamembertableptrMemberfunctiontab......