C++ 将布尔值设置为0安全吗?
假设我有一些遗留的代码,除非发现一个错误,否则无法更改,并且它包含以下代码:C++ 将布尔值设置为0安全吗?,c++,language-lawyer,memset,C++,Language Lawyer,Memset,假设我有一些遗留的代码,除非发现一个错误,否则无法更改,并且它包含以下代码: bool data[32]; memset(data, 0, sizeof(data)); 这是将数组中的所有bool设置为false值的安全方法吗 更一般地说,将memsetabool设置为0以使其值false是否安全 它能保证在所有编译器上工作吗?或者我需要请求修复吗?法律有保证吗?否。 C++没有提到bool值的表示 是否有现实的保障?是。 我的意思是,如果你想找到一个C++实现,它不代表布尔 false 作为
bool data[32];
memset(data, 0, sizeof(data));
这是将数组中的所有bool
设置为false
值的安全方法吗
更一般地说,将memset
abool
设置为0
以使其值false
是否安全
它能保证在所有编译器上工作吗?或者我需要请求修复吗?法律有保证吗?否。 C++没有提到
bool
值的表示
是否有现实的保障?是。
我的意思是,如果你想找到一个C++实现,它不代表布尔<代码> false <代码>作为一个0的序列,我祝你好运。考虑到
false
必须隐式转换为0
,true
必须隐式转换为1
,0
必须隐式转换为false
,而非0
必须隐式转换为true
…那么,用任何其他方法实现它都是愚蠢的
这是否意味着它“安全”由你决定
我通常不会这么说,但如果我处在你的处境,我会很乐意让这一切顺其自然。如果您真的担心,您可以在安装实际项目之前,将测试可执行文件添加到可分发文件中,以验证每个目标平台上的前提条件。来自3.9.1/7:
键入bool、char、char16\u t、char32\u t、wchar\u t以及签名和
无符号整数类型统称为整数类型。A.
整数类型的同义词是整数类型。代表
积分类型应使用纯二进制计数定义值
系统
考虑到这一点,我看不到任何可能的
bool
实现不会将false表示为所有0位。否。它是不安全的(或者更具体地说,是可移植的)。但是,由于您的典型实现将:
memset()
可以处理的元素数组然而,最佳实践要求使用
bool data[32]={false}
——此外,这可能会让编译器在内部以不同的方式表示结构——因为使用memset()
可能会导致它生成一个32字节的值数组,而不是,一个单独的4字节,将很好地适应您的平均CPU寄存器。更新
他说:
根据EWG在圣地亚哥的决定,与P0907R3不同,bool被指定为具有某种整数类型作为其基础类型,但“bool”的填充位的存在将保持未指定状态,true和false与基础类型的值的映射也将保持未指定状态
原始答案
我相信这是未指定的,尽管看起来false
的基本表示形式可能是全零。(我的重点):
Container使用std::memset和零值来初始化一些
与大多数平台中的类型一样,此初始化会产生所需的
具有改进性能的值初始化
遵循C11标准,Boost.Container假设
整数类型,所有位均为零的对象表示形式
应表示该类型中的零值自
C++ Boo/WCHARYT/CHAR160T/CHAR32是T中的整数类型,它将所有C++积分类型视为可初始化的STD::MSESET。< /强>
他们指出的C11引文作为理由实际上来自C99缺陷:该缺陷增加了以下内容:
对于任何整数类型,所有位均为
零应表示该类型中的值零
那么,这里的问题是假设正确,是C和C++之间的整数兼容的底层对象表示吗? 这项建议试图在某种程度上回答这个问题,但据我所知,这个问题没有得到解决。我在标准草案中找不到这方面的确凿证据。我们有两种情况,它在类型方面显式地链接到C标准。第
3.9.1节[basic.basical]说:
[…]有符号和无符号整数类型应满足
C标准第5.2.4.2.1节中给出的约束条件
和3.9
[basic.types],其中说明:
T型对象的对象表示为N序列
类型为T的对象占用的无符号字符对象,其中N等于
sizeof(T)。对象的值表示是一组位
保存类型T的值。对于可复制的类型,值
表示是对象表示中的一组位
确定一个值,该值是
实现定义的一组值。44
其中脚注44(非规范性)规定:
目的是C++的内存模型与
ISO/IEC 9899编程语言C
《标准草案》在第3.9.1节中规定了bool的基本表示形式:
键入bool、char、char16\u t、char32\u t、wchar\u t以及签名和
无符号整数类型统称为整数类型。50 A
整数类型的同义词是整数类型。代表
积分类型应使用纯二进制计数定义值
system.51[示例:本国际标准允许2
的补码、1的补码和符号幅值表示
整数类型。-结束示例]
该节还说:
bool类型的值为true或false
但是我们所知道的true
和false
是:
布尔文本是关键字f