Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何复制/设置易失性std::string?_C++_String_Volatile_Stdstring - Fatal编程技术网

C++ 如何复制/设置易失性std::string?

C++ 如何复制/设置易失性std::string?,c++,string,volatile,stdstring,C++,String,Volatile,Stdstring,如何复制易失性std::string?volatile没有复制构造函数,类似c_str的东西也不允许volatile访问operator=似乎也不允许设置volatile。似乎std::string无法作为易失性对象使用。这是有意的,还是我错过了一些使用它的方法 注意:我有一些简单的解决方法,我只是在尝试在一些低级代码中使用字符串时遇到了这个问题。正如您所指出的,std::string上的任何成员函数都没有标记为volatile,因此您不能对volatile std::string执行任何操作。

如何复制
易失性std::string
?volatile没有复制构造函数,类似
c_str
的东西也不允许volatile访问
operator=
似乎也不允许设置volatile。似乎
std::string
无法作为易失性对象使用。这是有意的,还是我错过了一些使用它的方法


注意:我有一些简单的解决方法,我只是在尝试在一些低级代码中使用字符串时遇到了这个问题。

正如您所指出的,
std::string
上的任何成员函数都没有标记为
volatile
,因此您不能对
volatile std::string
执行任何操作。我认为唯一的选择是抛弃
volatile
ness并对结果执行操作,如下所示:

const_cast<std::string&>(myVolatileString) = "Now I'm different!"
const_cast(myVolatileString)=“现在我不同了!”
但从根本上说,您可能不应该制作一个
volatile std::string
volatile
适用于可能被外部源变异或被多个线程更改的对象。第一种情况非常罕见,需要一些非常特殊的硬件,它们知道
std::string
的布局。第二个是不安全的,因为
std::string
不是线程安全的


希望这有帮助

volatile std::string是非常错误的。你到底想做什么?<代码>易失性>代码>意味着对象位于C++内存模型之外。我想说,对于动态容器来说,这个概念几乎是完全不可用的。我正在测试,看看是否可以在编译器的JIT中替换malloc/free调用。这是中止处理的一部分(使用setjmp)。就标准而言,完全未定义的领域让我对易失性字符串感到好奇。然而const_cast是否消除了对象的易失性?也就是说,它是否使访问看起来好像没有声明为“易失性”?@edA-qamort-ora-y-是的。它返回一个对对象的非volatile引用,然后可以将其视为任何非volatile字符串。@C++11中的Bцћ-
volatile
,向编译器指示该值可以由另一个线程写入而不锁定,因此,编译器不应该试图优化对象的读取。@templatetypedef我听说过其他方法,包括。是的,它的意思是“不要优化掉读取”,但是一个普通的(例如)
int
不会被原子地读取或写入,所以无论如何你都会得到UB。你确信你没有混淆C++ <代码>易失性>代码>用java <代码>易失性>代码>,这有什么作用?这不是我感兴趣的易失性的线程方面。我正在使用setjmp/longjmp,并希望防止跨越该边界进行优化。