Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
有符号整数溢出属于未定义行为;负数右移结果由实现定义,负数左移或移入不可表示范围也有危险。位运算优先使用合适宽度的无符号类型,并在移位前保证位数小于类型宽度。
功能宏应集中定义、明确默认值和合法组合,构建系统生成唯一配置头并记录到制品元数据。对互斥或依赖选项使用预处理错误或静态断言,CI 至少覆盖支持矩阵,避免源码各处散落隐式宏。
柔性数组只能作为结构体最后一个成员,本身不计入常规 sizeof,但结构尾部可能仍有填充。分配时要检查 header + count * element 是否溢出,并让对象总寿命覆盖所有访问。
.text 通常存代码,.rodata 存只读常量,.data 存有非零初值的静态存储期对象,.bss 存零初始化对象;栈承载调用帧和自动对象,堆由分配器管理动态对象。最终位置由链接脚本和平台共同决定。
模板按实际类型实例化,不同类型或非类型参数可能产生多份机器码;内联与错误处理路径也会放大体积。但链接合并和 LTO 可能消除相同实现,必须用 map、nm 和尺寸差异实测。
移动通常转移资源句柄并清空源对象,不要求搬动资源本体;`std::move` 只是转换为可移动的值类别。被移动对象必须保持有效且可析构,但具体值往往只保证满足类型契约。
复杂表达式中的操作数求值顺序并非都由源码从左到右保证;在缺少规定顺序的情况下对同一标量多次修改或修改后读取,可能产生未定义行为。工程上应拆成单一副作用语句。