【发布时间】:2023-03-18 08:48:01
【问题描述】:
在一个程序中,我正在处理一些使用字节别名的程序,方法如下:
#include <fstream>
#include <vector>
using Byte = unsigned char;
void write(const Byte* buffer, size_t size) {
std::basic_fstream<Byte> file("1gb_file", std::ios::in | std::ios::out);
file.write(buffer, size);
file.flush(); // To ensure the data is being written, to eliminate caching claims
}
int main(){
auto GB = 1024u * 1024u * 1024u;
std::vector<Byte> zeros(GB, 0);
write(zeros.data(), zeros.size());
return 0;
}
此函数在Byte == unsigned char 上执行的时间:52.0245s 在我全新的 SSD 上,MSVC-x64 处于发布模式。
另一方面,如果我们将定义更改为Byte == char:1.46725s。就是这样。
为什么会有这种差异?在使用标准库方面是否有任何一般的良好做法来避免此类陷阱?
注意(因错误而编辑):正如@SergeyA 指出的那样,在 Linux 上,当给定 unsigned char(在 gcc 和 clang 上)时,代码实际上无法运行。 Windows 上的 GCC 版本也无法运行,这与我之前写的相反。
【问题讨论】:
-
如果您将 Linux 安装为操作系统,我实际上想知道是否也会发生这种情况,因为我只在 VM 上测试过,无法复制错误,尽管这并没有意义重大(因为在 VM 上“写入磁盘”可能会将所有内容写入 RAM 并稍后刷新)。
-
在我的 Linux 安装上它根本不起作用。
write失败,unsigned char流在 thje 流上设置坏位。据我所知,内部实现细节成员(从名称来看,与转换语言环境有关)是 nullptr。看起来 unsigned char 流并不是真正的主流。 -
添加检查
file.good()然后 perror 给出Invalid or incomplete multibyte or wide character并且没有写入文件。检查您的退货代码。 -
@stark 你是对的,但这只发生在 Linux 上,我已经相应地修复了帖子。 Windows 版本虽然工作得很好。我实际上没有设法得到那个错误,我得到了和 SergeyA 一样的错误。
-
其实是Cygwin下的Windows,不是Linux。
标签: c++ windows performance file io