草庐IT

c++ - 我应该更喜欢在 C++ 代码中使用小类型的 int(int8 和 int16)吗?

我在一个针对嵌入式Linux的C++/Qt项目中工作,在这个项目中,我们不断地与处理器的限制“决斗”,特别是在更新用户界面中的图形时。由于这些限制(特别是我们前段时间的情况,当时情况更糟),我总是尽可能地优化代码,如果优化成本最低的话。我所做的其中一项优化是始终针对我正在处理的情况使用正确的整数值:qint8、qint16和qint32,具体取决于我需要的值有多大。但前段时间我在某处读到,与其尝试尽可能使用整数的最小大小,我应该总是更喜欢使用与我的处理器容量相关的整数值,也就是说,如果我的处理器是32-面向位,那么即使不需要这么大的整数,我也更愿意始终使用qint32。一开始我不明白为

c++ - 在c++代码中,下列关键字是什么意思? SIGSELECT、U32、U16、U8

我对c++结构中的关键字用法有疑问。我见过这样定义的结构:typedefstruct{SIGSELECTsigno;U32id;U32re;U16id1;U8id2;}First;请帮助我理解这些关键字:SIGSELECT,U32,U16,U8 最佳答案 他们的“意思”是一个很深的问题,而且还取决于你所处的环境。这些是类型名称,但不是标准的C++类型,因此它们并不广为人知。一个猜测是Uxx类型是指定位宽的“无符号整数”。因此U32将是一个32位无符号整数,在C99中称为uint32_t但尚未在C++中标准化。SIGSELECT有点难

c++ - 如何使枚举类与 'bit-or' 功能一起使用?

我通常将enum与“位或”或|一起使用,以允许对象具有一些选项。如何使枚举类使用“位或”功能? 最佳答案 您需要为您的枚举类重载运算符并通过转换为基础类型来实现它们:enumclassfoo:unsigned{bar=1,baz=2};foooperator|(fooa,foob){returnstatic_cast(static_cast(a)|static_cast(b));}…当然这可以推广(使用SFINAE和std::underlying_type)。在我看来,C++没有提供开箱即用的功能是一种疏忽。这是一般的实现方式://

c++ - 16 位 float 和 GL_HALF_FLOAT

我正在寻找/编写16位float的C++实现,以与OpenGL顶点缓冲区(纹理坐标、法线等)一起使用。到目前为止,这是我的要求:必须是16位(显然)。必须能够使用GL_HALF_FLOAT上传到OpenGL顶点缓冲区。必须能够表示超出-1.0-+1.0的数字(否则我只会使用标准化的GL_SHORT)。必须能够与普通32位float相互转换。算术运算无关紧要-我只关心存储。速度不是主要问题,正确性才是。这是我到目前为止的界面:classhalf{public:half(void):data(0){}half(consthalf&h):data(h.data){}half(constuns

c++ - std::string、wstring、u16/32string 说明

我目前对std::string和std::wstring之间区别的理解只是缓冲区的类型;即,分别是char和wchar_t。我还读到大多数(如果不是全部)Linux发行版对任何和所有字符串使用char,包括ASCII和UTF,其中Windows是使用的主要操作系统wchar_t了。然而,还有一些字符串类型我想直接记在脑子里:u16string和u32string,它们是2字节和4字节的字符串字节缓冲区,分别。所以,我的问题是:在sizeof(wchar_t)==2的平台上,std::wstring在功能上等同于std::u16string,以及作为具有sizeof(wchar_t)==

c++ - 为什么 "std::vector<bool>"的大小是 16 Byte?

我正在使用memcpy将std:vectors的内容复制到原始数组。对于int、float、double等数据类型,它运行良好。当我开始复制boolvector时,我遇到了一个问题,即我得到了奇怪的值。首先,我开始为浮点vector制作测试输出:std::vectortest1(3,0);cout输出是:Sizeoftest1[0]:4Memoryaddress0:02793820Memoryaddress1:02793824Memoryaddress2:02793828这就是我所期望的。浮点大小为4字节,到下一个浮点值的距离为4字节。当我为bool执行此操作时,输出如下所示:std:

c++ - utf8 <-> utf16 : codecvt poor performance

我正在研究我的一些旧的(并且专门面向win32的)东西并考虑使它更现代/可移植-即在C++11中重新实现一些可广泛重用的部分。这些部分之一是utf8和utf16之间的转换。在Win32API中,我正在使用MultiByteToWideChar/WideCharToMultiByte,尝试使用此处的示例代码将这些内容移植到C++11:https://stackoverflow.com/a/14809553.结果是发布版本(由MSVS2013编译,在Corei73610QM上运行)stdlib=1587.2msWin32=127.2ms调试构建stdlib=5733.8msWin32=12

c++ - 使用按位运算符的 MAX 16 个字符字符串的 Strlen

挑战在于找到在C/C++中使用C中的按位运算确定C字符串长度的最快方法。charthestring[16];c字符串的最大长度为16个字符,并且位于缓冲区内如果字符串等于16个字符,则末尾没有空字节。我确定可以完成,但还没有做对。目前我正在处理这个问题,但假设字符串存储在零填充缓冲区中。len=buff[0]!=0x0+buff[1]!=0x0+buff[2]!=0x0+buff[3]!=0x0+buff[4]!=0x0+buff[5]!=0x0+buff[6]!=0x0+buff[7]!=0x0+buff[8]!=0x0+buff[9]!=0x0+buff[10]!=0x0+buff

c++ - 计算 Modbus RTU CRC 16

我正在实现一个软件,我可以通过串口在ModbusRTU协议(protocol)中读取和写入数据。为此,我需要计算字节串末尾的两个CRC字节,但我无法做到这一点。在网上搜索,我发现了两个似乎可以正确计算CRC的函数:WORDCRC16(constBYTE*nData,WORDwLength){staticconstWORDwCRCTable[]={0X0000,0XC0C1,0XC181,0X0140,0XC301,0X03C0,0X0280,0XC241,0XC601,0X06C0,0X0780,0XC741,0X0500,0XC5C1,0XC481,0X0440,0XCC01,0X0

c++ - 如何使用 SSE 将 16 位整数除以 255?

我负责图像处理。我需要将16位整数SSEvector除以255。我不能使用像_mm_srli_epi16()这样的移位运算符,因为255不是2的倍数。我当然知道可以将整数转换为float,执行除法,然后再转换回整数。但也许有人知道另一种解决方案...... 最佳答案 有一个除以255的整数近似值:inlineintDivideBy255(intvalue){return(value+1+(value>>8))>>8;}因此使用SSE2时它看起来像:inline__m128iDivideI16By255(__m128ivalue){r