【深入理解C++11】第八章 融入实际应用

8.1 对齐支持

 对齐的数据在读写上有性能优势,比如频繁使用的数据如果与处理器的高速缓存大小对齐,有可能提高缓存性能。数据不对齐,可能会导致一些应用的崩溃,例如某些平台,硬件无法读取不按字节对齐的的数据,可能会抛出异常。

 C++11标准为了支持对齐,主要引入了:操作符alignof、对齐描述符alignas
 使用示例如下:

// 每个 sse_t 类型对象将对齐到 16 字节边界
struct alignas(16) sse_t
{
  float sse_data[4];
};
 
// 数组 "cacheline" 将对齐到 128字节边界,有利于CPU缓存
alignas(128) char cacheline[128];

struct Foo {
    int   i;
    float f;
    char  c;
};

struct Empty {};

//使用alignas将此类型修饰为64字节对齐
struct alignas(64) Empty64 {};

    //查看内存对齐
    std::cout << "Alignment of"  "\n"
        "- char             : " << alignof(char) << "\n"
        "- pointer          : " << alignof(int*) << "\n"
        "- class Foo        : " << alignof(Foo) << "\n"
        "- empty class      : " << alignof(Empty) << "\n"
        "- alignas(64) Empty: " << alignof(Empty64) << "\n";

    //查看类型占用内存大小
    std::cout << "sizeof"  "\n"
        "- char             : " << sizeof(char) << "\n"
        "- pointer          : " << sizeof(int*) << "\n"
        "- class Foo        : " << sizeof(Foo) << "\n"
        "- empty class      : " << sizeof(Empty) << "\n"
        "- alignas(64) Empty: " << sizeof(Empty64) << "\n";

在这里插入图片描述
另外我们还可以使用STL的align函数以及,模板函数aligned_storagealigned_union,修改一个类型的对齐方式。

8.2 通用属性

通用属性只会对编译器优化有影响,格式如:[[attr1]] void func [[attr2]] ()

8.3 Unicode支持

 C++11新增了char16_tchar32_t用于存储UTF-16和UTF-32编码的Unicode数据。另外还新增了常量字符串前缀,在声明常量字符串的时候,这些前缀可以让编译器让字符串按照前缀类型产生数据。

  • u8表示UTF-8编码。
  • u表示UTF-16编码。
  • U表示UTF-32编码。

示例如下:

    char utf8[] = u8"\u4F60\u597D\u554A";
    char16_t utf16[] = u"hello";
    char32_t utf32[] = U"hello equals \u4F60\u597D\u554A";

    cout << utf8 << endl;
    cout << utf16 << endl;
    cout << utf32 << endl;

8.4 原生字符串字面量

 原生字符串使得用户书写的字符串“所见即所得”,不再需要’\t’,’\n’等控制字符串来调整字符串中格式。
例如:cout << R"(hello, \n world)" << endl; 其中’\n’将不会起作用。

`

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值