C++面试题1 这篇内容是高频 C++ 基础面试问答合集,覆盖运行时生命周期、内存模型、指针引用、宏与类型系统等核心知识点。进程与对象生命周期从 main 前后执行流程切入,梳理了全局/静态对象初始化与析构、atexit、编译器扩展属性等概念。强调“程序入口前后仍有大量运行时行为”这一常见面试考点。有助于理解 C++ 程序并非只由 m…
1、 在main执行之前和之后执行的代码可能是什么? main函数执行之前,主要就是初始化系统相关资源:设置栈指针初始化静态static变量和global全局变量,即.data段的内容将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL等等,即.bss段的内容全局对象初始化,在main之前调用构造函数,这是可能会执行前的一些代码将main函数的参数argc,argv等传递给main函数,然后才真正运行main函数__attribute__((constructor))这是gnu C里面的东西,可修饰函数,控制它在main函数之前执行,它不跨平台。 main函数执行之后:全局对象的析构函数会在main函数之后执行;可以用 atexit 注册一个函数,它会在main 之后执行;(跨平台,是标准库里的东西__attribute__((destructor))同上面的construct,只不过是在main函数执行后。2、结构体内存对齐问题?结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同。未特殊说明时,按结构体中size最大的成员对齐(若有double成员,按8字节对齐。) c++11以后引入两个关键字 alignas (opens new window)与 alignof (opens new window)。其中alignof可以计算出类型的对齐方式,alignas可以指定结构体的对齐方式。 但是alignas在某些情况下是不能使用的,具体见下面的例子:// alignas 生效的情况 struct Info { uint8_t a; uint16_t b; uint8_t c; }; std::cout << sizeof(Info) << std::endl; // 6 2 + 2 + 2 std::cout << alignof(Info) << std::endl; // 2 struct alignas(4) Info2 { uint8_t a; uint16_t b; uint8_t c; }; std::cout << sizeof(Info2) << std::endl; // 8 4 + 4 std::cout << alignof(Info2) << std::endl; // 4 alignas将内存对齐调整为4个字节。所以sizeof(Info2)的值变为了8。// alignas 失效的情况 struct Info { uint8_t a; uint32_t b; uint8_t c; }; std::cout << sizeof(Info) << std::endl; // 12 4 + 4 + 4 std::cout << alignof(Info) << std::endl; // 4 struct alignas(2) Info2 { uint8_t a; uint32_t b; uint8_t c; }; std::cout << sizeof(Info2) << std::endl; // 12 4 + 4 + 4 std::cout << alignof(Info2) << std::endl; // 4 若alignas小于自然对齐的最小单位,则被忽略。 如果想使用单字节对齐的方式,使用alignas是无效的。应该使用#pragma pack(push,1)或者使用__attribute__((packed))。#if defined(__GNUC__) || defined(__GNUG__) #define ONEBYTE_ALIGN __attribute__((packed)) #elif defined(_MSC_VER) #define ONEBYTE_ALIGN #pragma pack(push,1) #endif struct Info { uint8_t a; uint32_t b; uint8_t c; } ONEBYTE_ALIGN; #if defined(__GNUC__) || defined(__GNUG__) #undef ONEBYTE_ALIGN #elif defined(_MSC_VER) #pragma pack(pop) #undef ONEBYTE_ALIGN #endif std::cout << sizeof(Info) << std::endl; // 6 1 + 4 + 1 std::cout << alignof(Info) << std::endl; // 6 确定结构体中每个元素大小可以通过下面这种方法:#if defined(__GNUC__) || d…
本应用需要启用 JavaScript。
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行