"The C11 atomics were almost copy'n'pasted from C++11. All the work was done for C++, and C (sensibly) incorporated it wholesale."
上面这句话源自:C11 atomic variables and the kernel [LWN.net]
翻译过来就是:
"C11 中的原子操作几乎是从 C++11 复制粘贴过来的。所有的工作都是为了 C++ 完成的,而 C(合理地)全盘接纳了这些特性。"
具体的异同:
1. 使用方法
C11 原子变量
- 头文件:需要包含
<stdatomic.h>
。 - 数据类型:通过
_Atomic
关键字和类型定义(例如atomic_int
)。 - 初始化:推荐使用
ATOMIC_VAR_INIT
宏。 - 操作函数:使用标准库提供的函数,例如
atomic_store
,atomic_load
。
C++11 原子变量
- 头文件:需要包含
<atomic>
。 - 数据类型:使用模板类
std::atomic<T>
。 - 初始化:通过构造函数直接初始化。
- 操作函数:使用类成员函数,例如
store
,load
。
2. 示例代码
C11 示例代码:
#include <stdatomic.h>
#include <stdio.h>int main() {atomic_int a = ATOMIC_VAR_INIT(0); // 使用宏初始化atomic_store(&a, 5); // 存储操作int value = atomic_load(&a); // 加载操作printf("Value: %d\n", value);return 0;
}
C++11 示例代码:
#include <atomic>
#include <iostream>int main() {std::atomic<int> a{0}; // 使用构造函数初始化a.store(5); // 存储操作int value = a.load(); // 加载操作std::cout << "Value: " << value << std::endl;return 0;
}
3. 编译参数
C11编译参数
使用 GCC 或 Clang 编译 C11 代码时,需要指定 C11 标准:
gcc -std=c11 -o my_program my_program.c
clang -std=c11 -o my_program my_program.c
C++11 编译参数
使用 GCC 或 Clang 编译 C++11 代码时,需要指定 C++11 标准:
g++ -std=c++11 -o my_program my_program.cpp
clang++ -std=c++11 -o my_program my_program.cpp
4. 关键区别总结
-
头文件:
- C11 使用
<stdatomic.h>
。 - C++11 使用
<atomic>
。
- C11 使用
-
数据类型:
- C11 使用
atomic_int
等_Atomic
类型定义。 - C++11 使用模板类
std::atomic<T>
。
- C11 使用
-
初始化:
- C11 推荐使用
ATOMIC_VAR_INIT
宏进行初始化,也可以直接赋值。 - C++11 通过构造函数直接初始化。
- C11 推荐使用
-
操作函数:
- C11 使用标准库函数,如
atomic_store
,atomic_load
。 - C++11 使用类成员函数,如
store
,load
。
- C11 使用标准库函数,如
-
编译参数:
- C11 需要使用
-std=c11
。 - C++11 需要使用
-std=c++11
。
- C11 需要使用