zhanzr21的个人空间 https://bbs.21ic.com/?1195922 [收藏] [复制] [RSS]

日志

C11标准综述-3

已有 112 次阅读2018-1-5 18:54 |系统分类:兴趣爱好

匿名结构体与联合体

顾名思义,匿名结构体/联合体没有名字.这种定义对于嵌套聚合定义很有用,比如结构体中的联合体成员.以下的代码使用C11的新功能在结构体中定义一个匿名联合体之后直接访问其联合体的成员.
struct T //C++, C11
{
int m;
union //anonymous
{
  char * index;
  int key;
};
};
struct T t;
t.key=1300; //access the union's member directly

泛型函数

C11没有模板功能,但是使用宏来达到泛型函数的目的.新的关键字_Generic指定泛型表达式.
下面的例子泛型宏cbrt(X)根据X的实际类型被翻译为特定函数:cbrtl(long double), cbrtf(float), cbrt(double)中的一种.
//C11 only
#define cbrt(X) _Generic((X), long double: cbrtl,
                              default: cbrt,
                              float: cbrtf)(X)
其原理,编译器根据参数X的类型来进行相应的替换.

内存对齐控制

继C++11之后,C11引入了读取/强制变量与类型进行内存对齐的功能. _Alignas关键字指定类型或对象的对齐要求. alignof这个操作符则用来获取其操作数的对齐情况. 最后aligned_alloc()函数用来进行指定对齐的内存分配.
void *aligned_alloc(size_t algn, size_t size);
这个函数以algn的对齐分配size大小的内存,返回所分配内存的指针.
C11中新的对齐相关功能于新的头文件<stdalign.h>中定义.

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)