我测试了这段代码,试图找出为新运算符实际保留了多少内存c ++.
#include<iostream>
using namespace std;
int main() {
cout << "alignment of " << alignof(int) << endl;
int *intP1 = new int;
*intP1 = 100;
cout << "address of intP1 " << intP1 << endl;
int *intP2 = new int;
*intP2 = 999;
cout << "address of intP2 " << intP2 << endl;
int *intP3 = new int;
cout << "address of intP3 " << intP3 << endl;
*intP3 = 333;
cout << endl;
cout << (reinterpret_cast<char *>(intP3)-reinterpret_cast<char *>(intP2)) …Run Code Online (Sandbox Code Playgroud) 我在Anthony Williams的书"C++ Concurrency"的内存模型中测试了这个例子
#include<atomic>
#include<thread>
#include<cassert>
std::atomic_bool x,y;
std::atomic_int z;
void write_x_then_y() {
x.store(true, std::memory_order_relaxed);
y.store(true, std::memory_order_relaxed);
}
void read_y_then_x() {
while(!y.load(std::memory_order_relaxed));
if(x.load(std::memory_order_relaxed)) {
++z;
}
}
int main() {
x = false;
y = false;
z = 0;
std::thread a(write_x_then_y);
std::thread b(read_y_then_x);
a.join();
b.join();
assert(z.load()!=0);
}
Run Code Online (Sandbox Code Playgroud)
根据解释,对差异变量(此处为x和y)的放松操作可以自由重新排序.但是,我重复运行这个问题超过几天.我从未遇到断言(assert(z.load()!= 0);)触发的情况.我只是使用默认优化并使用g ++编译代码-std = c ++ 11 -lpthread dataRaceAtomic.cpp有没有人真正尝试并点击断言?谁能给我一个关于我测试结果的解释?顺便说一句,我也尝试了不使用原子类型的版本,我得到了相同的结果.目前,这两个项目都在健康运行.谢谢.