首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么basic_fstream<unsigned char>比Windows上的basic_fstream<char>慢几个数量级?

basic_fstream<unsigned char>比Windows上的basic_fstream<char>慢几个数量级的原因是因为字符类型的选择导致了不同的文件读写方式。

basic_fstream<unsigned char>使用无符号字符类型(unsigned char),而basic_fstream<char>使用有符号字符类型(char)。在Windows系统中,默认的字符类型是有符号的char。

在文件读写过程中,无符号字符类型(unsigned char)的范围是0-255,而有符号字符类型(char)的范围是-128到127。当使用无符号字符类型(unsigned char)进行文件读写时,每个字符都需要进行类型转换,将有符号字符类型(char)转换为无符号字符类型(unsigned char),这个过程会引入额外的开销,导致性能下降。

另外,由于basic_fstream<unsigned char>使用无符号字符类型(unsigned char),在进行文件读写时,可能会导致一些字符的解释发生变化。例如,在某些情况下,将有符号字符类型(char)转换为无符号字符类型(unsigned char)可能会导致字符的解释发生变化,从而影响文件读写的正确性。

综上所述,basic_fstream<unsigned char>比Windows上的basic_fstream<char>慢几个数量级的原因主要是字符类型的选择不同导致的额外开销和可能引发的字符解释变化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

fstream读写文件read_使用同一个fstream

fstream本质是一个class,提供file操作各种方法。 2.关系图 basic_fstream是一个类模板,暂且不用深入理解它。我们关心事,它前面继承那一堆东西。...fstream是basic_fstream一个模板类,也就说明,fstream也继承了一堆东西。 我们再关心一下从 ios_base基类,重点继承了什么?文件流打开模式。...3.3 读文件 read() basic_istream& read( char_type* s, std::streamsize count ); 它是继承于istream类。...怎么多了好几个? 因为… fs.write()是将内容写入缓冲区(内存)。fs.sync() 是为了将缓冲区内容刷新写入硬盘。而read方法是只能读取硬盘上内容,读不了缓冲区。...3.4 读文件 getline() 读文件操作,getlineread更加常用。 getline一读就一整行了。

1.1K10

完全合并C++面试题

为什么?...从机制:c是面向过程(但c也能够编写面向对象程序);c++是面向对象,提供了类。可是, c++编写面向对象程序ceasy 从适用方向:c适合要求代码体积小。...从名称也能够看出,c++c多了+,说明c++是c超集;那为什么不叫c+而叫c++呢,是由于c++ c来说扩充东西太多了,所以就在c后面放上两个+。...你知道为什么在VC中会得出这样一个结果吗? 事实,这是VC对变量存储一个特殊处理。 为了提高CPU存储速度,VC对一些变量起始地址做了”对齐”处理。...你知道为什么在VC中会得出这样一个结果吗? 事实,这是VC对变量存储一个特殊处理。为了提高CPU存储速度。VC对一些变量起始地址做了”对齐”处理。

36720
  • 动态执行流程分析和性能瓶颈分析利器——valgraindcallgrind

    每个线程信息在图上都有一定显示宽度,其宽度占和线程在整个进程中CPU占用占一致。...虽然在valgrind中运行程序正常运行都要很多,但是这种可以认为是对所有操作都,所以我们只要查看某个过程在整体中就可以了。        ...可以见得,改动后程序执行效率只有之前1/10。这种已经出一个数量级了!         我们使用valgrind进行分析,过程和之前分析调用关系一样。我们只简单解读下结果 ?        ...但是相同调用次数下,不同渠道来CPU资源占不一样。printf(包括自身和其调用vfprintf)资源占只有37.85%,而sprintf资源占则有60.63%。...这并不符合我们分析,那什么原因呢?         屏幕设备也是一种资源!我们在屏幕输出信息也是占用一种资源,而且这种资源是稀缺

    1.2K20

    动态执行流程分析和性能瓶颈分析利器——valgrindcallgrind

    每个线程信息在图上都有一定显示宽度,其宽度占和线程在整个进程中CPU占用占一致。...虽然在valgrind中运行程序正常运行都要很多,但是这种可以认为是对所有操作都,所以我们只要查看某个过程在整体中就可以了。        ...可以见得,改动后程序执行效率只有之前1/10。这种已经出一个数量级了!         我们使用valgrind进行分析,过程和之前分析调用关系一样。...printf(包括自身和其调用vfprintf)资源占只有37.85%,而sprintf资源占则有60.63%。那么如果我们优化掉sprintf,则调用效率应该又会有所提升。        ...这并不符合我们分析,那什么原因呢?         屏幕设备也是一种资源!我们在屏幕输出信息也是占用一种资源,而且这种资源是稀缺

    1.2K20

    你所能用到BMP格式介绍(二)

    最开始,希望你还记得什么叫无符号整数和有符号整数,实际,你得庆幸在一般图像中没有浮点数,不然你需要复习或者重新学习基础这个还多。        ...)<<" ";   }   int num=10;   total_str+=str+(unsigned char)num;   }      cout<<endl;          代码虽然很少看上去程序还混乱...unsigned char来表示,所以我们进行了将str[i]值转换成unsigned char,至于再转换成int是为了能够显示出十六进制数字。         ...也许,你会问我,数据区和调色板为什么不用unsigned char, 这里完全可以用unsigned char 我用UINT16 目的是因为我懒得再重新定义一个数据类型了。         ...四、如果你会MFC       如果你熟悉windows编程,那么你一定知道上面的结构在MFC以及windows编程里都是已经有了结构,那你需要做只是将图片加载到内存,在控件显示。

    92970

    阿里面试官必问12个MySQL数据库基础知识,哪些你还不知道?

    数据库基础知识 为什么要使用数据库 什么是SQL? 什么是MySQL? 数据库三大范式是什么 mysql有关权限表都有哪几个 MySQLbinlog有有几种录入格式?分别有什么区别?...1)速度内存操作,频繁IO操作。...第二范式:在第一范式基础,非主键列完全依赖于主键,而不能是依赖于主键一部分。 第三范式:在第二范式基础,非主键列只依赖于主键,不依赖于其他非主键。...MySQL有关权限表都有哪几个 MySQL服务器通过权限表来控制用户对数据库访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。...使用策略: 对于经常变更数据来说,CHARVARCHAR更好,因为CHAR不容易产生碎片。 对于非常短列,CHARVARCHAR在存储空间更有效率。

    1.4K00

    一种清除windows通知区域“僵尸”图标的方案——Windows7系统解决方案

    Windows7下“僵尸”图标的解决方案         从《一种清除windows通知区域“僵尸”图标的方案——问题分析》(以后简称《问题分析》)一文中分析通知区域结构可以看出,Windows7通知区域...虽然我们可以在“控制面板\所有控制面板项\通知区域图标”下选择“始终在任务栏显示所有图标和通知(A)”,来让Windows7通知区域和XP一致,但是我们无法让用户这么去做,因为我们给不出这样做必要...或许有人会问,为什么XP下不这么做呢?因为XP下无法删除其他进程创建图标。        XP下密集出现“僵尸”图标问题,应该是引起了微软注意。...DWORD dwSize = GetModuleFileName(NULL, wcharPath, ARRAYSIZE(wcharPath) ); unsigned char md5[...char * buf, unsigned int unbufferlenth, unsigned char* retMd5, unsigned int unMd5BufferSize) {

    74230

    【算法随记七】巧用SIMD指令实现急速字节流按位反转算法。

    ,这段代码结果耗时110ms,256个元素查找表。   ...个查找表多路并行还是要。   ...但是,到这里,就出现了一个令我非常感兴趣的话题了,我一直在思考如何利用SIMD指令实现快速查表问题,后来得到结论是,这个基本不可行,对应SSE,除非几个特殊表,一个情况就是,这个查找表只有16个元素...在此基础,我们可以将这个函数扩展到使用AVX优化,AVX支持一次性处理32个字节数据,SSE还要扩展一倍,并且现在大部分CPU已经支持AVX2了,尝试一下: void Byte_Reverse_10...最后,我们在返回到最开始unsigned char Reverse8U(unsigned char x)函数,我们发现,这个函数内部算法天然就支持SSE并行化处理,我们可以稍微修改下语法就可以得到对应

    1.2K20

    【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(最近邻还快)之异象解析和自我实现。

    稍微冷静下来,我认为这绝对不符合真理,但是我心中已经隐隐约约知道大概为什么会出现这个情况,于是,我又做了下面几个测试。...对于这个特例,我们用C语言可以简单写出其计算过程: int IM_ZoomIn_Half_Bilinear(unsigned char *Src, unsigned char *Dest, int SrcW...如果我们使用AVX指令进行优化,整体基本和SSE差不多,但是局部细节还是有所差异,如下所示: for (int Y = 0; Y < DstH; Y++) { unsigned char *...那么我们再谈谈为什么这个速度最近邻插值还要快吧,最近邻算法中,不存在插值,直接在源图像中选择一个坐标位置点作为新像素值,在放大时其会出现多行像素相同特性,这个特性可以用来加快算法执行速度,但是对于缩小...在耗时,比如上面这个操作,直接缩小到1/4因不是特殊处理,而通过2次一半处理每次都是特殊算法,虽然次数多了,但是总耗时也就直接缩小1/4多了0.5倍,效果却要好一点,对于那些重效果地方,还是非常有意义

    88620

    用C数据类型宽度扩展来解释char c=128;printf(%d,c);问题

    代码编译运行环境:Windows 64bits+VS2017+Debug+Win32 ---- 1.问题描述 在编程或者面试过程中,可能会遇到如下问题: char c=128; printf("%d",...这个是本文核心问题,理解了这个,就可以很好地解释为什么char c=128;printf(“%d”,c); 输出是-128。...当char型扩展到int型时,C标准中有如下规则: (2.1)短数据类型扩展为长数据类型 (a)要扩展短数据类型为有符号数,进行符号扩展,即短数据类型符号位填充到长数据类型高字节位(即短数据类型多出那一部分...unsigned char x=10001001b; short y=x; 则y值应为00000000 10001001b; //例1 unsigned char x=00001001b;...比如一个字节中存放数据是11111111,以unsigned char来解释就是255,以char来解释就是-1。

    98410

    mysql数据类型详解(1)

    优化设计不良或索引不佳架构能把性能提升几个数量级。如果需要高性能,就必须运行特定查询设计架构和索引,还要评估不同类型查询性能要求,因为更改某个查询或架构一部分会对其他部分造成影响。...他们范围为-2(N-1)到2(N-1)-1,这里n是所需存储空间位数。 整数类型可选unsigned属性,它表示不允许负数,并大致把正上限提高一倍。...例如tinyint unsigned 保存范围为0到255,而不是-127到128。 实数有分数部分。可以使用decimal保存bigint还大整数。mysql同时支持精度与非精度类型。...varchar和char类型 varchar可变长度字符串,是使用最多字符串类型。它能固定长度类型占用更少存储空间,因为它占用了自己需要空间。...char是固定长度。mysql总是为特定数量字符分配足够空间,当保存char时候,mysql会去掉任何末尾空格。存储很短字符串或长度相似的字符串时候很有用。

    97180

    【短道速滑一】OpenCV中cvResize函数使用双线性插值缩小图像到长宽大小一半时速度飞快(最近邻还快)之异象解析和自我实现。

    稍微冷静下来,我认为这绝对不符合真理,但是我心中已经隐隐约约知道大概为什么会出现这个情况,于是,我又做了下面几个测试。...对于这个特例,我们用C语言可以简单写出其计算过程: int IM_ZoomIn_Half_Bilinear(unsigned char *Src, unsigned char *Dest, int SrcW...如果我们使用AVX指令进行优化,整体基本和SSE差不多,但是局部细节还是有所差异,如下所示:   for (int Y = 0; Y < DstH; Y++) { unsigned...那么我们再谈谈为什么这个速度最近邻插值还要快吧,最近邻算法中,不存在插值,直接在源图像中选择一个坐标位置点作为新像素值,在放大时其会出现多行像素相同特性,这个特性可以用来加快算法执行速度,但是对于缩小...在耗时,比如上面这个操作,直接缩小到1/4因不是特殊处理,而通过2次一半处理每次都是特殊算法,虽然次数多了,但是总耗时也就直接缩小1/4多了0.5倍,效果却要好一点,对于那些重效果地方,还是非常有意义

    53020

    MySQL基础数据类型

    如果多写了几个_呢?...,能表示0-65535数字,所以varchar在存储时候是这样:1bytes+sb+1bytes+ssb1+1bytes+ssbb2,所以存时候会比较麻烦,导致效率char,取时候也,先拿长度...优点:节省了一些硬盘空间,一个acsii码字符用一个bytes长度就能表示,但是也并不一定char省,看一下官网给出一个表格对比数据,当你存数据正好是你规定字段长度时候,varchar反而占用空间...总结:     所以需要根据业务需求来选择用哪种类型来存     其实在多数用户量少工作场景中char和varchar效率差别不是很大,最起码给用户感知不是很大,并且其实软件级别的远比不上硬件级别的...但是对于InnoDB数据表,内部行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值头指针),因此在本质,使用固定长度CHAR列不一定使用可变长度VARCHAR列性能要好。

    5K10

    【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数修饰规则)

    一、从编译原理分析 为什么什么C语言不支持函数重载呢?...二、C++支持函数重载原理–名字修饰(name Mangling) 而C++在此基础在,C语言基础对符号表中函数名做了新修饰,所以同名但 (参数个数 或 类型 或 类型顺序) 不同...2.2 linux下C++命名修饰规则 linux 下函数修饰名实际非常简单: _Z 是修饰符 3 是函数名符号数 后面跟 ii 是 形参类型 2.2 Windows下名字修饰规则...以上是一些文档对Windows下函数名字修饰规则一些解释再,windows中函数名字修饰并不是很理解 windows下修饰符 修饰符所代表意思 X void D char E unsigned...char F short H int I unsigned int J long K unsigned long(DWORD) M float N double _N bool U struct 2.3

    7200

    【Qt源码笔记】深谈 Qt 绘制

    结论 在 Windows 平台 默认 Qt 绘制,最终到底层,是直接调用指令集指令,这有别于我最初猜测,我以为是用 Windows API 。这着实让我吃了一惊。...qt_blend_argb32_on_argb32_avx2(unsigned char * destPixels, int dbpl, const unsigned char * srcPixels,...这是 Qt 作为一个高级框架闪光点,在其他 Qt 模块也有类似发现,比如控件绘制。这样看来 Qt 这个框架能给我们,除了代码逻辑本身,还有设计。...至于为什么这种用法可行,这也是一个可研究点,有时间,将其整理出来。这段代码算是研究绘制过程中一个小礼物,这也解开了QWidget绘制本质。...我也说 Windows 平台下默认 Qt 绘制是使用指令集

    2K50

    位运算方法,小结

    本文是针对使用位运算来实现一些方法,我们都知道位运算代价其他符号运算都低,所以当一个方法只使用位运算且运算次数与其他不纯使用位运算方法相等时,所用时间肯定是最短,甚至即使运算次数其他 方法多...当然实际不是所有的运算时间都是相同。我们知道有很多东西影响系统运行一段代码所花时间长短,比如缓存大小,内存带宽,机器指令集等等。...当然制定一个衡量标准来判断一个方法是否另外一个方法快,这样是最好解决方案, 这里衡量标准就是运算次数。...-(unsigned)v : v 即使这个方法运算符次数与上面的是一样,这个速度还是。...= (b)), ((b) += (a)), ((a) = (b) - (a)))) 不建议对浮点数使用这个方法,会比XOR方法. ---- 交换两个变量值(只使用XOR) #define SWAP

    752130

    C语言:--位域和内存对齐

    位域 位域是指信息在保存时,并不需要占用一个完整字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构,叫“位域”或“位段”。...“位域“是把一个字节中二进位划分为几个不同区域,并说明每个区域位数,每个域有一个域名,允许在程序中按位域名进行操作。这样就可以把几个不同对象用一个字节二进制位域来表示。...(整个struct大小为4,因为位域本质是从一个数据类型分出来,在我们例子中数据类型就是unsigned,大小为4,并且位域也是满足C 结构体内存对齐原则,等下我们会说到)。...说到位域就不得说下内存对齐东西,其实内存对齐也很简单,只是不同编译器实现不一样,至于为什么要内存对齐,这个要从CPU基本工作原理说起,但是首先要明白,无论我们是否内存对齐,CPU大多数情况都是能正常工作...bytes   char padding2[4]; // 4 bytes   double d; // 8 bytes   unsigned e; // 4 bytes   char padding3

    2.9K30
    领券