深入理解C++11 读书笔记(八) 融入实际应用

8 篇文章 0 订阅

数据对齐

  • 查询成员在类中的偏移量
//Defined in header <cstddef>
#define offsetof(type, member) /*implementation-defined*/
  • 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定义的常量字符串前缀
    1. u8表示UTF-8编码
    2. u表示UTF-16编码
    3. U表示UTF-32编码
    4. 宽字符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前缀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值