Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 将布尔值设置为0安全吗?_C++_Language Lawyer_Memset - Fatal编程技术网

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
a
bool
设置为
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位。

否。它是不安全的(或者更具体地说,是可移植的)。但是,由于您的典型实现将:

使用0表示布尔(实际上,C++规范要求它)
  • 生成
    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