小编Dan*_*nny的帖子

C++内存对齐是正确还是低效?

我测试了这段代码,试图找出为新运算符实际保留了多少内存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)

c++ memory alignment

6
推荐指数
1
解决办法
1080
查看次数

关于C++ 11内存模型的奇怪结果(轻松订购)

我在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有没有人真正尝试并点击断言?谁能给我一个关于我测试结果的解释?顺便说一句,我也尝试了不使用原子类型的版本,我得到了相同的结果.目前,这两个项目都在健康运行.谢谢.

c++ memory-model c++11

4
推荐指数
1
解决办法
1108
查看次数

标签 统计

c++ ×2

alignment ×1

c++11 ×1

memory ×1

memory-model ×1