相关疑难解决方法(0)

所有全局变量都应该是波动合格的吗?

在这个例子中,是否需要global_value声明正确性volatile

int global_value = 0;

void foo () {
    ++ global_value;
}

void bar () {
    some_function (++global_value);
    foo ();
    some_function (++global_value);
}
Run Code Online (Sandbox Code Playgroud)

我的理解是volatile" 指向 "用于指向映射内存和变量的指针,这些指针可以通过信号修改(并且强调不是为了线程安全)但是很容易想象bar可能编译成这样的东西:

push EAX
mov EAX, global_value
inc EAX
push EAX
call some_function
call foo
inc EAX
push EAX
call some_function
mov global_value, EAX
pop EAX
Run Code Online (Sandbox Code Playgroud)

这显然是不正确的,但即使没有volatile我认为根据C抽象机器它是有效的.我错了还是有效?

如果是这样的话,在我看来volatile经常被忽视.这不是什么新鲜事!


扩展示例

void baz (int* i) {
    some_function (++*i);
    foo (); …
Run Code Online (Sandbox Code Playgroud)

c c++ global-variables qualifiers volatile

11
推荐指数
2
解决办法
5576
查看次数

如何复制(或交换)包含引用或const成员的类型的对象?

我试图解决的问题产生于容器,例如std::vector包含引用和const数据成员的对象:

struct Foo;

struct Bar {
  Bar (Foo & foo, int num) : foo_reference(foo), number(num) {}
private:
  Foo & foo_reference;
  const int number;
  // Mutable member data elided
};

struct Baz {
  std::vector<Bar> bar_vector;
};
Run Code Online (Sandbox Code Playgroud)

这不会按原样工作,因为Foo由于引用成员foo_reference和const成员,无法构建类的默认赋值运算符number.

一种解决方案是将其更改foo_reference为指针并删除const关键字.然而,这会失去引用优于指针的优点,而该const成员确实应该这样做const.他们是私人成员,所以唯一可以造成伤害的是我自己的代码,但是我用自己的代码射击了自己的脚(或更高).

我已经看到了解决这一问题的形式在网络上swap出现的基础上的奇迹被座充满不确定的行为方式reinterpret_castconst_cast.碰巧这些技术确实在我的计算机上运行.今天.使用一个特定编译器的特定版本.明天还是用不同的编译器?谁知道.我不打算使用依赖于未定义行为的解决方案.

stackoverflow的相关问题:

那么有没有办法swap为这样一个不调用未定义行为的类编写方法/复制构造函数,或者我只是搞砸了?

编辑
只是为了说清楚,我已经非常了解这个解决方案:

struct Bar {
  Bar (Foo & foo, int …
Run Code Online (Sandbox Code Playgroud)

c++ swap copy-constructor

10
推荐指数
2
解决办法
4709
查看次数