草庐IT

c++ - 该程序中的 16 位数学是否调用了未定义的行为?

前几天,我将我的Windows构建环境从MSVC2013升级到MSVC2017,你瞧,我的程序中一个多年来一直运行良好(并且在g++/clang下仍然运行良好)的函数突然开始给出不正确的结果使用MSVC2017编译。我能够重写函数以再次给出正确的结果,但这段经历让我感到好奇——我的函数是调用了未定义的行为(直到现在恰好给出了正确的结果),还是代码定义明确并且MSVC2017有问题吗?下面是一个简单的程序,显示了我重写前后的函数玩具版本。特别是,函数maybe_invokes_undefined_behavior()(如下所示)在使用值为-32762的参数调用时是否会调用未定义的行为?#

c++ - 将 std::string 编码/解码为 UTF-16

我必须处理一种文件格式(读取和写入),其中字符串以UTF-16编码(每个字符2个字节)。由于ASCII表中的字符很少在应用程序域中使用,因此我的C++模型类中的所有字符串都存储在std::string(UTF-8编码)的实例中。我正在寻找一个库(在STL和Boost中搜索但没有运气)或一组C/C++函数来处理从文件格式加载或保存到文件格式时的这种std::stringUTF-16转换(实际上建模为字节流)包括代理对的生成/识别和所有Unicode内容(我承认我不是专家)...有什么建议吗?谢谢!编辑:忘了说它应该是跨平台的(Win/Mac)并且不能使用C++11。

c++ - cout << hex 与 uint8 和 uint16 的行为

我注意到cout给我奇怪的结果,我找不到任何地方可以回答为什么。我所做的只是为uint8_t分配一些值和uint16_t然后尝试将它们写入标准输出。当我运行这个时:uint8_ta=0xab;uint16_tb=0x24de;cout我得到的结果:$./a.out24de$没有显示uint8_t的值。是什么原因造成的?我不认为对于一种类型没有针对另一种类型的cout实现。 最佳答案 std::uint8_t是unsignedchar的别名:typedefunsignedcharuint8_t;因此选择了采用char&的插入器重载,并

c++ - 为什么 GCC 6 假设数据是 16 字节对齐的?

(很抱歉未能将我的问题简化为一个简单的失败测试用例...)我在升级到GCC6.3.0以构建我们的代码库时遇到了问题(相关标志:-O3-m32)。具体来说,由于GCC优化,我的应用程序在structctor调用中出现段错误。在这个构造函数中,GCC使用了movaps:movaps%xmm0,0x30a0(%ebx)movaps要求操作数16字节对齐。但此时,%ebx指向我的对象,它不一定是16字节对齐。来自glibc:“TheaddressofablockreturnedbymallocorreallocinGNUsystemsisalwaysamultipleofeight(orsix

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++ - 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