Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/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++ 什么时候在不牺牲正确性的情况下,故意使用未指明的行为会带来好处? 我将从使用术语的背景开始。 对的_C++_Performance_Theory_Correctness_Unspecified Behavior - Fatal编程技术网

C++ 什么时候在不牺牲正确性的情况下,故意使用未指明的行为会带来好处? 我将从使用术语的背景开始。 对的

C++ 什么时候在不牺牲正确性的情况下,故意使用未指明的行为会带来好处? 我将从使用术语的背景开始。 对的,c++,performance,theory,correctness,unspecified-behavior,C++,Performance,Theory,Correctness,Unspecified Behavior,“在理论计算机科学中,当一个算法相对于一个规范来说是正确的时,它的正确性被断言。”-堆栈溢出上的正确性标签 未定义的行为是允许任何事情发生的地方。事实上,发生的可能性是无限的。例子是在C++中取消一个null pTR,除以0。 明确的 这是唯一可能的结果 实现定义 这就是实现改变可能性数量的地方。如果某个被实现定义的东西产生了一个等同于未定义或定义良好的定义,那么它就不是我所指的 在这里,可能性大于一,但小于无穷多 利用未指明的行为 我指的是,为了某些好处,比如(但肯定不限于)性能或程序的正确性

“在理论计算机科学中,当一个算法相对于一个规范来说是正确的时,它的正确性被断言。”-堆栈溢出上的正确性标签

未定义的行为是允许任何事情发生的地方。事实上,发生的可能性是无限的。例子是在C++中取消一个null pTR,除以0。 明确的 这是唯一可能的结果

实现定义 这就是实现改变可能性数量的地方。如果某个被实现定义的东西产生了一个等同于未定义或定义良好的定义,那么它就不是我所指的

在这里,可能性大于一,但小于无穷多

利用未指明的行为 我指的是,为了某些好处,比如(但肯定不限于)性能或程序的正确性,将程序开放给未指定的行为。例如,将单线程程序转换为多线程程序可能会“利用”未指定的行为以获得好处

想法 这就是事情变得有趣的地方。或者,至少潜力是存在的。这是编程的灰色地带。关于什么可以或不可以发生有一些想法,但发生的事情既不是很明确,也不是没有定义的

一个简单且使用良好的示例涉及多线程。在处理多个线程时,还有很多未知和不可知的地方。尽管如此,还是使用了多线程,因为它带来了在其他情况下无法获得的重大性能提升的潜力

还有哪些地方可以在不牺牲正确性的情况下,故意实施未指定的行为带来好处?需要一些好处

对于那些想结束这个想法的人来说,这将邀请基于意见的答案——我反驳说,基于专业知识要求答案的问题是一个例外,是允许的。这是我提出这一问题的依据,也是我可以接受的。这是一个可以回答的问题


,我重新提问是因为我没有恰当地表达这个问题。我已经对它进行了重新措辞,现在特别要求给出一个答案,在不牺牲程序正确性的情况下显示其好处。

导致程序具有确定性行为的唯一情况是,无论实现使用哪种可能性,结果都是相同的

一个简单的例子是函数调用参数的求值顺序。如果无论以何种方式计算参数,结果参数列表都是相同的,则顺序的未指定行为无关紧要。

我制作了一个“非常有用”的程序,告诉您表达式
foo()+bar()中
+
的第一个或第二个操作数
在运行程序时首先计算:

#include <iostream>

bool done = false;

int foo() {
    if (!done) {
        std::cout << "First operand evaluated first" << std::endl;
        done = true;
    }
    return 0;
}

int bar() {
    if (!done) {
        std::cout << "Second operand evaluated first" << std::endl;
        done = true;
    }
    return 0;
}

int main()
{
    foo() + bar();
}
#包括
bool done=false;
int foo(){
如果(!完成){

std::cout未指定的行为不是程序员可以使用的(相反,如果程序员知道它需要小心地查看和避免什么,那么未指定的行为,就像所有其他行为一样:未定义的、实现定义的等等……是编译器编写者可以利用的(例如,子表达式的求值顺序具有未指定的行为,因为您不应在求值中传递任何具有副作用的子表达式,并且假设您处理好了这一点,编译器将对子表达式的求值进行重新排序,使其效率更高,某些子表达式可以包含可以重用的相同计算。)还有许多其他优化可以利用能够以最佳顺序进行评估的知识。

展示了如何设计一种算法来容忍未初始化缓冲区中存在的不确定值,从而避免迭代缓冲区来初始化它(以及所有相应的缓存未命中)


<>请注意,在C++中,使用不确定的值只是针对<代码>未签名char < /> >的未指定行为;对于所有其他类型,它将是未定义行为。请参阅标准第8.5节以获取更多信息。

< P>我不是一个聪明的火箭科学家。对我来说,你的问题

1)…对C++没有意义 在Stack Overflow的大多数读者每天都在做的传统编程中,我们只需要以确定性和可预测的方式定义和行为,从而生成可以工作的软件-。如果它今天可以工作,我们希望它明天也可以工作

C++也属于这一类

在这样一个传统的世界里,我看不出你的问题的答案究竟有什么用处,也看不出这个问题有什么用处

2) …在面向硬件的语言中有一定的意义 在编程语言中,程序员使用(处理)特殊变量状态(请参阅),表示一个未知的信号值,即承载信号的导线未连接、切断、拔出等

3) …在传统CPU世界之外是有意义的 有一个完整的计算世界,其中的术语未定义和未指定等完全发挥作用。这是最重要的

而从事这项工作的公司是

但这实际上是一个范式转变(类似于编程的)



我的平均智商回答是让你的问题对C++有用或者把它移到更合适的栈交换站点(例如)或在C++之外的口渴中解渴。
  • 在标准指示编译器可以任意方式从几种可能的行为中进行选择的情况下