Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ - Fatal编程技术网

C++ 使用未定义的溢出创建无符号整数?

C++ 使用未定义的溢出创建无符号整数?,c++,C++,在Chandler Carruth()于39:16左右完成的最近一次CppCon演讲中,他解释了如何让未定义的有符号整数溢出允许编译器生成优化的程序集。 这种优化也可以在Krister Walfridsson的这篇博文中找到 以前,由于受到INT_MAX上大小溢出的bug的困扰,我倾向于对代码中使用的类型过于迂腐,但同时我不想失去直接的性能提升 虽然我对汇编的知识有限,但这让我想知道创建一个带有未定义溢出的无符号整数需要什么?这似乎是一个反复出现的问题,但我没有发现任何建议引入一个(并最终更新s

在Chandler Carruth()于39:16左右完成的最近一次CppCon演讲中,他解释了如何让未定义的有符号整数溢出允许编译器生成优化的程序集。 这种优化也可以在Krister Walfridsson的这篇博文中找到

以前,由于受到
INT_MAX
上大小溢出的bug的困扰,我倾向于对代码中使用的类型过于迂腐,但同时我不想失去直接的性能提升


虽然我对汇编的知识有限,但这让我想知道创建一个带有未定义溢出的无符号整数需要什么?这似乎是一个反复出现的问题,但我没有发现任何建议引入一个(并最终更新
std::size\u t
),这样的事情有没有被讨论过?

没有带未定义溢出的无符号整数。C++非常明确,未签名类型不溢出;它们遵循模运算


该语言的未来版本是否可以添加一种算术类型,该类型不遵循模运算,但也不支持符号性(因此可能会使用其全部位)?大概但是所谓的性能提升并不是一个有符号的值(否则必须考虑正确地处理符号位,而未签名的值没有强制的“特殊”位),所以我不会屏住呼吸。事实上,虽然我不是组装专家,但我无法想象这在任何方面都会有用。

这个问题是完全落后的。没有什么灵丹妙药可以将行为视为未定义的行为,从而为编译器提供优化机会。总有一个偏移量

在某些条件下,操作具有未定义的行为,C++标准将不需要描述对所得行为的约束。这是标准中未定义行为的定义

<>对于C++标准(或任何标准-未定义的行为是标准的特征,而不仅仅是编程语言的标准),需要在一系列条件下实现不止一种现实的操作方式,从而产生不同的结果、优点和缺点。对于不止一种替代方案,还需要有现实的现实实施前景。最后,这些特征中的每一个都需要提供一些实际的机会(例如,使用这些特征的系统的期望属性等),否则可以指定一种方法,并且不需要替代方法

有符号整数的溢出在溢出时具有未定义的行为,因为有许多因素。首先,有符号整数有不同的表示形式(例如一补、二补等)。第二,有符号整数的表示(根据定义)包括符号的表示,例如符号位。第三,不存在固有优于另一个的有符号整数的特定表示形式(选择其中一个或另一个涉及工程权衡,例如在处理器内实现加法操作的电路设计中)。第四,现实世界中存在使用不同表示的实现。由于这些因素,对溢出的有符号整数的操作可能会在一个CPU上“包装”,但会导致必须在另一个CPU上清除的硬件信号。这些类型的行为中的每一种——或其他——在某种程度上,对于某些应用来说可能是“最优的”,而不是其他应用。该标准必须考虑到所有这些可能性,其方法是认为行为未定义

无符号整数上的运算具有明确定义的行为的原因是,没有那么多实际的方法来表示无符号整数或对其进行运算,而且——当在CPU电路中实现这些表示和运算时,结果都是相同的(即模运算)。在创建表示和操作无符号整数值的电路时,不需要担心“符号位”。即使无符号变量中的位的物理布局不同,操作的实现(例如,使用与非门的加法器电路)也会导致所有基本数学操作(加法、减法、乘法、除法)的溢出行为一致。而且,毫不奇怪,所有现有的CPU都是这样做的。没有一个CPU会在未签名溢出时生成硬件故障

因此,如果希望对无符号值的溢出操作具有未定义的行为,则首先需要找到一种以某种方式表示无符号值的方法,以产生多个可行/有用的结果/行为,并说明您的方案在某种程度上更好(例如,性能、更易于制造的CPU电路、应用性能等)。然后,您需要说服一些CPU设计人员实施这样一个方案,并说服系统设计人员该方案具有实际优势。同时,您需要让一些CPU设计人员和系统设计人员相信,就其目的而言,其他方案比您的方案具有优势。换句话说,真正的你的方法的使用必须包括真正的权衡,而不是你的方法在所有可能的替代品上都具有一贯的优势。然后,一旦你在不同方法的硬件中有多个实现,这就导致不同平台上溢出的行为不同——你需要说服C++标准化。n委员会认为在标准中支持您的方案(即利用您的方法的语言或库功能)是有好处的,并且需要允许所有可能的溢出行为。只有这样,无符号整数(或您的变量)才会溢出