为什么短语:"undefined behavior means the compiler can do anything it wants" 是真的?
Why is the phrase: "undefined behavior means the compiler can do anything it wants" true?
具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/
我是一名新的 C++ 程序员,目前正在学习未定义的行为及其对程序的影响。我被专门链接到上面的博客,它说当未定义的行为发生时,任何事情都可能发生。
它多次具体提到编译器可以允许发生未定义行为时发生任何事情。
具体是什么导致了这种情况发生,为什么会发生?
没有 "causes" 这会发生。未定义的行为不能 "occur"。没有神秘的力量降临到你的电脑上,突然让它在猫体内产生黑洞。
当你 运行 一个行为未定义的程序时,任何事情都可能发生,is stated as fact by the C++ standard. 这是一个回旋余地的陈述,一个方便的借口,编译器用来对你的代码做出假设,以便提供有用的优化。
例如,如果我们说取消引用 nullptr
是未定义的(确实如此),那么编译器就不需要检查指针是否不是 nullptr
:它可以假设取消引用指针永远不会是 nullptr
,如果不是,那么任何后果都是程序员的问题。
由于编译器的复杂性惊人,。
当然 "anything can happen" 并不是真的。您的计算机既没有必要的物理能力,也没有必要的法律授权来实例化猫体内的黑洞。但由于 C++ 是一种抽象,我们使用抽象来教导人们不要编写具有未定义行为的程序似乎是合适的。如果你严格地编程,假设 "anything can happen" 如果你的程序有未定义的行为,那么你不会对所说的意想不到的结果感到惊讶,你也不会被诱惑以任何方式尝试 "control" 结果.
从 C 和 C++ 标准的角度来看,某些情况调用 "Undefined Behavior" 的事实无非就是标准没有强加要求在该情况下实现必须做什么为了符合。它并不意味着任何特定的判断,即是否预期用于任何特定平台上的目的的实现行为可预测,也不意味着在这种情况下是否需要可预测的行为才能使实现适合于此类平台上的此类目的。
出于某种原因,一些编译器编写者将 "the Standard does not require X" 等同于 "there is no need for implementations to do X",而没有特别考虑他们的编译器的用途,也没有考虑可能需要哪些行为实现这些目的。导致未定义行为离题到 "anything can happen" 的原因是编译器作者将其解释为承认可能存在 一些 平台和应用程序领域的组合,确保可预测的成本行为会超过好处,编译器编写者应该对何时出现这种情况进行判断,而是作为标准作者已经对 all 组合进行判断的指示平台和应用程序领域,确保可预测行为的成本将超过收益,编译器编写者无需进行判断,因为标准的作者已经这样做了。
具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/
我是一名新的 C++ 程序员,目前正在学习未定义的行为及其对程序的影响。我被专门链接到上面的博客,它说当未定义的行为发生时,任何事情都可能发生。
它多次具体提到编译器可以允许发生未定义行为时发生任何事情。
具体是什么导致了这种情况发生,为什么会发生?
没有 "causes" 这会发生。未定义的行为不能 "occur"。没有神秘的力量降临到你的电脑上,突然让它在猫体内产生黑洞。
当你 运行 一个行为未定义的程序时,任何事情都可能发生,is stated as fact by the C++ standard. 这是一个回旋余地的陈述,一个方便的借口,编译器用来对你的代码做出假设,以便提供有用的优化。
例如,如果我们说取消引用 nullptr
是未定义的(确实如此),那么编译器就不需要检查指针是否不是 nullptr
:它可以假设取消引用指针永远不会是 nullptr
,如果不是,那么任何后果都是程序员的问题。
由于编译器的复杂性惊人,
当然 "anything can happen" 并不是真的。您的计算机既没有必要的物理能力,也没有必要的法律授权来实例化猫体内的黑洞。但由于 C++ 是一种抽象,我们使用抽象来教导人们不要编写具有未定义行为的程序似乎是合适的。如果你严格地编程,假设 "anything can happen" 如果你的程序有未定义的行为,那么你不会对所说的意想不到的结果感到惊讶,你也不会被诱惑以任何方式尝试 "control" 结果.
从 C 和 C++ 标准的角度来看,某些情况调用 "Undefined Behavior" 的事实无非就是标准没有强加要求在该情况下实现必须做什么为了符合。它并不意味着任何特定的判断,即是否预期用于任何特定平台上的目的的实现行为可预测,也不意味着在这种情况下是否需要可预测的行为才能使实现适合于此类平台上的此类目的。
出于某种原因,一些编译器编写者将 "the Standard does not require X" 等同于 "there is no need for implementations to do X",而没有特别考虑他们的编译器的用途,也没有考虑可能需要哪些行为实现这些目的。导致未定义行为离题到 "anything can happen" 的原因是编译器作者将其解释为承认可能存在 一些 平台和应用程序领域的组合,确保可预测的成本行为会超过好处,编译器编写者应该对何时出现这种情况进行判断,而是作为标准作者已经对 all 组合进行判断的指示平台和应用程序领域,确保可预测行为的成本将超过收益,编译器编写者无需进行判断,因为标准的作者已经这样做了。