Rob*_*rtS 3 c c++ memory memory-management boolean
我已经阅读了该问题的答案:为什么 c++ 中的 char 和 bool 的大小相同?并做了一个实验来确定内存中分配的字节大小 a_Bool
和 a bool
(我知道这bool
是一个_Bool
in的宏,stdbool.h
但为了完整起见,我也使用了它)在 C 中的bool
对象,以及在我的实现中的 C++ 中的对象Linux Ubuntu 12.4:
对于 C:
#include <stdio.h>
#include <stdbool.h> // for "bool" macro.
int main()
{
_Bool bin1 = 1;
bool bin2 = 1; // just for the sake of completeness; bool is a macro for _Bool.
printf("the size of bin1 in bytes is: %lu \n",(sizeof(bin1)));
printf("the size of bin2 in bytes is: %lu \n",(sizeof(bin2)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1
Run Code Online (Sandbox Code Playgroud)
对于 C++:
#include <iostream>
int main()
{
bool bin = 1;
std::cout << "the size of bin in bytes is: " << sizeof(bin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
the size of bin in bytes is: 1
Run Code Online (Sandbox Code Playgroud)
因此,布尔类型的对象,无论是 C 还是 C++,都在内存中占用 1 个字节(8 位),而不仅仅是 1 位。
我的问题是:
bool
以及_Bool
在 C 和bool
C++ 中只能存储0
或1
如果它们在可以容纳 256 个值的内存中占用 1 个字节的值?当然,它们的目的是只表示0
and1
或true
and的值false
,但是哪个单元或宏决定它只能存储0
or 1
?
另外,但不是我的主要问题:
*不小心我的意思是:被“无法检测的手段”修改 -什么是“不可检测的手段”,它们如何更改 C/C++ 程序的对象?或不适当的 fe 分配bool a; a = 25;
。
C 语言限制了可以存储在 a 中的内容_Bool
,即使它有能力保存除 0 和 1 之外的其他值。
C 标准的第 6.3.1.2 节说明了以下关于转换为 的内容_Bool
:
当任何标量值转换为 时
_Bool
,如果该值比较等于 0,则结果为 0;否则,结果为 1。
在C ++ 17标准具有第7.14类似的语言:
算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为 type 的纯右值
bool
。零值、空指针值或空成员指针值转换为 false;任何其他值都将转换为 true。对于直接初始化(11.6),类型的纯右值std::nullptr_t
可以转换为类型的纯右值bool
;结果值为假。
所以,即使你尝试给其他值的_Bool
语言将值转换为0或1℃,到true
或false
为C ++。如果您尝试_Bool
通过指向不同类型的指针写入 a 来绕过此问题,则会调用undefined behavior。
归档时间: |
|
查看次数: |
628 次 |
最近记录: |