首页
学习
活动
专区
工具
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_fstreamchar>的一个模板类,也就说明,fstream也继承了一堆东西。 我们再关心一下从 ios_base基类,重点继承了什么?文件流的打开模式。...3.3 读文件 read() basic_istream& read( char_type* s, std::streamsize count ); 它是继承于istream类。...怎么多了好几个? 因为… fs.write()是将内容写入缓冲区(内存)。fs.sync() 是为了将缓冲区的内容刷新写入硬盘。而read方法是只能读取硬盘上的内容,读不了缓冲区。...3.4 读文件 getline() 读文件的操作,getline比read更加常用。 getline一读就一整行了。

1.2K10

完全合并C++面试题

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

37320
  • 动态执行流程分析和性能瓶颈分析的利器——valgraind的callgrind

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

    1.2K20

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

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

    1.3K20

    你所能用到的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编程里都是已经有了的结构,那你需要做的只是将图片加载到内存,在控件上显示。

    94570

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

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

    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) {

    75430

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

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

    1.3K20

    【短道速滑】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倍,效果却要好一点,对于那些重效果的地方,还是非常有意义的

    92120

    用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。

    1K10

    【短道速滑一】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倍,效果却要好一点,对于那些重效果的地方,还是非常有意义的

    54120

    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会去掉任何末尾的空格。存储很短的字符串或长度相似的字符串时候很有用。

    97780

    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

    9100

    【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 绘制是使用指令集的。

    2.1K50

    位运算的方法,小结

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

    761130

    MySQL基础『数据类型』

    UNSIGNED] M 指定显示长度,D 指定小数位数,大小依赖具体平台,通常占用 4 字节,但在某些情况下可能达到 8 字节 DOUBLE [(M, D)] [UNSIGNED] 比 FLOAT 精度更高...,大小通常为 8 字节,在某些情况下可能更大 DECIMAL(M, D) [UNSIGNED] 比 DOUBLE 精度更高,能完全保证数据的精度,适用于需要高精度的金融计算 字符、二进制类型 CHAR...,后面出现了一堆小数;而 decimal 则是指哪打哪,插入的数据非常准确,精度保持的非常稳定 3.3.如何选择 float 比 decimal 占用空间小,decimal 比 float 精度高 如果对精度要求不是很高...这是因为 MySQL 中的 char 类型大小并非 1 字节,而是 1 字符,无论是什么语言,都可以按个数插入,而非实际占用空间,这与 C/C++ 中的 char 有根本上的区别 这也就是解释了为什么...,总之:数据类型本质上就是一种约束,确保插入数据库中数据的合法性

    22010
    领券