数据对齐
#define offsetof(type, member)
- C++11标准定义alignof函数查看数据的对齐方式,修饰符alignas重新定义对齐方式。
- C++11之前,一些编译器扩展描述对齐方式,比如GNU的
__attribute__((__aligned__(8)))
- std::align函数对台调整数据对齐
- aligned_storage和aligned_union
Unicode支持
- unicode字符集,每个字符一个码位,范围0-10FFFF。编码方式很多,utf8,utf16,utf32。windows使用utf16,macOS,linux使用utf8.
- utf8 使用1-6字节变长编码,优点节约空间,和ASCII兼容,英文1字节,中文3字节,使用广泛。
- 汉字码表 gb2312 简体中文,两个字节表示。Big5 繁体中文,也是两个字节。
- C++98标准为支持unicode设计
wchar_t
,可是对于wchar_t
没有同意宽度,完全由编译器实现决定,在windows上多数是16位,在linux上多数是32位,理论上wchar_t
可以是8,16,32位,因此通常不可移植。C++11为了改善此问题,引入新的内置数据
char16_t
:用于存储utf16编码的unicode数据,16位char32_t
:用于存储utf32编码的unicode数据,32位
utf8编码的unicode数据仍然由char来存储。
- C++11定义的常量字符串前缀
- u8表示UTF-8编码
- u表示UTF-16编码
- U表示UTF-32编码
- 宽字符wchar_t前缀 L
- 一旦使用前缀,编译器在生成代码的时候按照相应的编码存储。unicode编码书写时,可以用转义字符书写。
"\u****"
表示一个utf16的码位,*是16进制的数字。"\U********"
是utf32的码位。 - unicode字符串声明类型(char,char16_t,char32_t)要和字符串前缀一致,否则出错。
char c1[] = u8"dsfads\u9AD8 fdsf";
char16_t c2[] = u"dsfadsafd";
char32_t c3[] = U"dfadsa";
char16_t c4[] = u8"dfadsf"; //Error
- 影响用户最终看到字符串有很多因素,源代码编辑器保存编码格式,编译时编译器设置的编码格式,输出设备对编码的支持。
- C11和C++11都引入
char16_t和char32_t
,提供了不同的unicode转换函数。C11中有mbrtoc16,mbrtoc32,c16rtomb,c32rtomb
函数。C++提供的模板类codecvt。
原生字符串字面量
- raw string literal,即所见即所得。使用时加上前缀R。声明unicode的原生字符串使用uR,u8R,UR前缀。