为什么 char* 为什么不能在 c++ 文件中的 write 函数中使用 bool* I/O
why char* why not bool* can be used in write function in c++ file I/O
在这条语句中,为什么将 x 转换为 char* 而不是 bool*-
out.write( (char*)&(x), sizeof(double) );
布尔值有两个值:true 和 false。
除非缓冲区中的每个字节都只有两个值之一,否则选择这种类型来表示任意数据将是一种极其愚蠢的类型。
char
被视为常规 "some byte" 类型。因此,char*
是常规的 "pointer to some bytes" 类型。
In this statement why cast x to char* and not to bool* ...
怀疑你在想bool
,从概念上讲是一个位,是C++中最基本的数据类型。事实并非如此。在 C++ 中,单个位不可寻址。 C++ 内存模型是围绕字节的概念组织的,字节必须至少包含八位。根据定义,char
(以及相关类型 signed char
和 unsigned char
)正好是一个字节长。
位不可寻址意味着布尔数据类型的概念不太适合内存模型。连续的布尔值要么在它们之间有间隙(这对于您建议的转换为 bool*
会有问题)或者布尔值可以包含比 false
和 true
多得多的值(也有问题;布尔值包含 false
或 true
以外的其他值是未定义的行为)。
C++ I/O 模型将基于字节的内存模型扩展到 I/O。 C++ I/O 流包含字节序列(在宽字符的情况下有时包含多个字节)而不是位序列。这就是为什么 std::basic_ostream::write
将某种字符类型的指针(通常是 char
)和大小作为参数。
在这条语句中,为什么将 x 转换为 char* 而不是 bool*-
out.write( (char*)&(x), sizeof(double) );
布尔值有两个值:true 和 false。
除非缓冲区中的每个字节都只有两个值之一,否则选择这种类型来表示任意数据将是一种极其愚蠢的类型。
char
被视为常规 "some byte" 类型。因此,char*
是常规的 "pointer to some bytes" 类型。
In this statement why cast x to char* and not to bool* ...
怀疑你在想bool
,从概念上讲是一个位,是C++中最基本的数据类型。事实并非如此。在 C++ 中,单个位不可寻址。 C++ 内存模型是围绕字节的概念组织的,字节必须至少包含八位。根据定义,char
(以及相关类型 signed char
和 unsigned char
)正好是一个字节长。
位不可寻址意味着布尔数据类型的概念不太适合内存模型。连续的布尔值要么在它们之间有间隙(这对于您建议的转换为 bool*
会有问题)或者布尔值可以包含比 false
和 true
多得多的值(也有问题;布尔值包含 false
或 true
以外的其他值是未定义的行为)。
C++ I/O 模型将基于字节的内存模型扩展到 I/O。 C++ I/O 流包含字节序列(在宽字符的情况下有时包含多个字节)而不是位序列。这就是为什么 std::basic_ostream::write
将某种字符类型的指针(通常是 char
)和大小作为参数。