C++ 零散内容记录¶
约 431 个字 预计阅读时间 1 分钟
Abstract
看到的一些讨论、知识,或者需要学的一些内容。
TODO¶
- 初始化 看这个:Is C++11 Uniform Initialization a replacement for the old style syntax?;Initialization in C++ is bonkers;dcl.init#general
- value category
- 右值引用、移动语义
- placement new
- 模板
- POD
- 常量构造
- inline
- stream
关于 UB 和指针等的大讨论¶
- 原帖
- 我的尝试
- 下面的作者给的例子
- Pointers Are Complicated, or: What's in a Byte? 本文还有后续
- "What The Hardware Does" is not What Your Program Does: Uninitialized Memory
- With Undefined Behavior, Anything is Possible
- A Guide to Undefined Behavior in C and C++
- 引文 Taming Undefined Behavior in LLVM
- 引文 Reconciling High-Level Optimizations and Low-Level Code in LLVM
为什么要有 UB¶
Src: https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html
零散内容¶
- RTTI
- overhead: https://stackoverflow.com/a/5408269/14430730,就是在 vtable 里多了一项
- 不过如果不用typeid或者dynamic_cast也需要创造这个项,所以好像没什么 overhead
- dereference 这个词已经没用了,现在都叫 indirection [n3362]
- 关于用空指针调用成员函数是不是 UB
- SO 问题
- 调用静态成员函数不是 UB,见 Closed 315
- 但非静态成员仍然是 Active 的
Attribute [[assume]]
:C++23,告诉编译器可以依据哪些额外的信息进行优化;但是很容易引发 UB;TODO;`std::unreachable()~- struct 的比较:
std::tie
, https://en.cppreference.com/w/cpp/language/operators#Comparison_operators
关于数组初始化¶
int a[4] = {1, 2};
效果等同于 int a[4] = {1, 2, 0, 0};
:
初始化 int a[4] = {1, 2};
是 aggregate initialization。第一个元素是 explicitly initialized element,其他的则不是。非 explicitly initialized element 规定如下:
此时,即 list initialization int a_1 = {};
。其中规定:
而 value initialization 对于基本类型是 zero-initialized 的:
而 zero initialization 对于标量类型即为显式 cast 到 0:
要看的¶
const 系列¶
const
指明一个变量是不可变的;