草庐IT

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++ - 高阶位——把它们变成 uint64_t 变成 uint8_t

假设您有一个uint64_t,并且只关心uint64_t中每个字节的高位。像这样:uint32_t:0000...10000000100000001000000010000000--->00001111有没有比以下方法更快的方法:return(((x>>56)&128)+((x>>49)&64)+((x>>42)&32)+((x>>35)&16)+((x>>28)&8)+((x>>21)&4)+((x>>14)&2)+((x>>7)&1))也就是移位x、屏蔽并为每个字节添加正确的位?这将编译成很多程序集,我正在寻找一种更快的方法......我使用的机器只有SSE2指令,我找不到有用的S

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++ - 冒号是什么意思(:) operator in "uint isWidget : 1;" in Qt?

这个问题在这里已经有了答案:Whatdoesacoloninastructdeclarationmean,suchas:1,:7,:16,or:32?(3个答案)关闭7年前。“uintisWidget:1;”中冒号(:)运算符的含义是什么?在Qt?是“uintisWidget:1;”等同于“uintisWidget(1)”?Qt中的代码是QObjectData{public:virtual~QObjectData()=0;QObject*q_ptr;QObject*parent;QObjectListchildren;uintisWidget:1;uintpendTimer:1;uin

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++ - 无法编译任何 C++ 程序;错误 : unknown type name 'uint8_t'

EDIT2:问题是不是简单的打印错误。我在下面的日志中打错了字,我更正了,但问题仍然存在。编辑:在下面尝试之后,我错误地使用gcc而不是g++运行了一次。问题在g++之前就存在,现在也存在。我目前使用的是MacOSHighSierra机器。我最近将很多文件从MacBookAir移到了这台机器上,包括我认为都是Xcode的垃圾。现在,当我尝试编译一个非常简单的C++程序时:#includeintmain(){//VAR_DECinta=4;//VAR_MANIPa=a*2;//VAR_PRINTstd::cout我收到以下荒谬的错误:jrfarah@Josephs-MBP:[config

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

c++ - UINT_MIN 的可移植值是多少?

在limits.h中,有INT_MAX和INT_MIN(以及SHRT_*和LONG_*等)的#defines,但是只有UINT_MAX。我应该自己定义UINT_MIN吗?0(正零)是可移植值吗? 最佳答案 它是一个无符号整数-根据定义,它的最小可能值为0。如果你想要一些除了常识之外的理由,standard说:6.2.6.2IntegertypesForunsignedintegertypesotherthanunsignedchar,thebitsoftheobjectrepresentationshallbedividedinto

c++ - x64 CPU 上的原子 16 字节读取

我需要以原子方式读/写16个字节。我只使用cmpxchg16进行写作,它在所有x64处理器上都可用,除了我认为是一个不起眼的AMD处理器。现在的问题是对齐的16字节值,仅使用cmpxchg16进行修改(它就像一个完整的内存屏障)是否有可能读取一半旧数据和一半新数据的16字节位置?只要我用SSE指令读取(所以线程不能在读取中间中断)我认为读取是不可能的(即使在多处理器numa系统中)看到不一致的数据。我认为它必须是原子的。我假设当执行cmpxchg16时,它会原子地修改16个字节,而不是通过写入两个8字节的block,其他线程有可能在两者之间进行读取(老实说,我不明白它是怎么做到的)如果