Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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/6/cplusplus/127.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++;对于Java内存模型,单线程程序是否有唯一合法/有效的执行? 问题是针对C++或java内存模型的主题,它定义了一个程序允许展示的行为。查看内存模型的一种简单方法是将其视为“过滤器”,它定义了一组规则来取消执行(行为的痕迹)与非法行为,剩下的一组执行是合法的。 char * a = new char[2000]; char * b = new char[2000]; if( ((uintptr_t)a) < ((uintptr_t)b) ) { // even on the same operating system ALSR may cause different runs to execute in here. }_Java_C++_Multithreading_Java Memory Model_Memory Model - Fatal编程技术网

在C++;对于Java内存模型,单线程程序是否有唯一合法/有效的执行? 问题是针对C++或java内存模型的主题,它定义了一个程序允许展示的行为。查看内存模型的一种简单方法是将其视为“过滤器”,它定义了一组规则来取消执行(行为的痕迹)与非法行为,剩下的一组执行是合法的。 char * a = new char[2000]; char * b = new char[2000]; if( ((uintptr_t)a) < ((uintptr_t)b) ) { // even on the same operating system ALSR may cause different runs to execute in here. }

在C++;对于Java内存模型,单线程程序是否有唯一合法/有效的执行? 问题是针对C++或java内存模型的主题,它定义了一个程序允许展示的行为。查看内存模型的一种简单方法是将其视为“过滤器”,它定义了一组规则来取消执行(行为的痕迹)与非法行为,剩下的一组执行是合法的。 char * a = new char[2000]; char * b = new char[2000]; if( ((uintptr_t)a) < ((uintptr_t)b) ) { // even on the same operating system ALSR may cause different runs to execute in here. },java,c++,multithreading,java-memory-model,memory-model,Java,C++,Multithreading,Java Memory Model,Memory Model,问题是:对于单线程程序,给定固定的初始条件(例如输入参数、变量的初始值)且不与外部进程交互,是否存在唯一的合法执行(即只有一个执行满足内存模型) 后续问题:如果有一个以上的法律执行,是什么导致了不确定性 >:对于C++,让我们先考虑排序,然后才是总数。< /P> 编辑:正如juanchopanza在评论中所建议的,动态分配地址是单线程程序不确定性的一个来源。在C++中有一个多路径,两者都是合法的 char * a = new char[2000]; char * b = new char[

问题是:对于单线程程序,给定固定的初始条件(例如输入参数、变量的初始值)且不与外部进程交互,是否存在唯一的合法执行(即只有一个执行满足内存模型)

后续问题:如果有一个以上的法律执行,是什么导致了不确定性

<> >:对于C++,让我们先考虑排序,然后才是总数。< /P>
编辑:正如juanchopanza在评论中所建议的,动态分配地址是单线程程序不确定性的一个来源。

C++
中有一个多路径,两者都是合法的

 char * a = new char[2000];
 char * b = new char[2000];


 if( ((uintptr_t)a) < ((uintptr_t)b) ) {
      // even on the same operating system ALSR may cause different runs to execute in here.
 }
char*a=新字符[2000];
char*b=新字符[2000];
如果(((uintpttr_t)a)<((uintpttr_t)b)){
//即使在同一操作系统上,ALSR也可能导致在此处执行不同的运行。
}

<> P> > C++中没有一条路径是合法的——有多条路径。

< P>不,没有唯一的执行路径,也没有一个单端状态保证C++。p> 即使在保证之前有顺序,最常见的原因之一是不同参数评估中的副作用:参数评估的顺序不由标准定义,并且取决于实现。例如,以下代码可以提供多个有效输出,具体取决于所使用的编译器:

int display (int i, int j) {
    std::cout << i << " " << j << std::endl; 
    return i<j ? i:j; 
}
void my_funny_func (int a, int b, int c) {
    std::cout << a << " " << " " << b << " " c << std::endl;
}
...
   int i=1, j=1; 
   my_funny_func(display(i,j), display(++i, j), display(i, ++j)); 
int显示(int i,int j){

std::难道你问的不是100%清楚吗?内存模型在你描述的条件中是不相关的-可能的重新排序不会影响任何东西。因此忽略明显的边缘情况(例如,代码表现出未定义的行为),听起来你是在问单线程程序是否具有确定性?@OliverCharlesworth你是对的,我是在问单线程程序是否具有确定性。事实上,我试图了解导致多线程程序中出现非确定性行为的所有因素。@314314314这取决于程序运行。例如,BST(例如
std::map
)其中键是对象地址。元素的排序可能取决于动态分配对象的地址。这些元素可能看起来是非确定性的,因为它们依赖于程序范围之外的事物。C++不是Java.问题是,谁关心单个线程应用程序上的内存模型?整个问题。在C中,等价的是UB(具体来说,比较指针与无关对象)。不确定如果C++是相同的……我相信比较int类型是未指定的行为。谢谢!后续问题:除了“不确定的顺序的论据评估”之外。是否有其他原因导致C++中的非确定性行为?是的,例如,您调用了静态构造函数的顺序。有几个好的东西是实现定义的,因此可能会在不同编译器上给出不同的结果。(例如:sieOf,或对象布局或字符是否签名)或CPU体系结构(例如:对齐,或者是表示性)。这就是为什么编写真正的可移植C++代码需要一些规则的原因。