草庐IT

c++ - 为什么这个专门用于 basic_ifstream 模板的 char_traits<uint8_t> 和 codecvt<uint8_t> 会抛出 std::bad_cast?

Therearealreadyquestions在Stackoverflow上询问为什么basic_fstream不起作用。答案说char_traits仅专门用于char和wchar_t(加上char16_t,char32_t在C++11中)你应该坚持使用basic_fstream读取二进制数据并根据需要进行转换。该死的,这还不够好!:)没有一个答案(我能找到)说如何特化char_traits并将其与basic_fstream一起使用模板,或者如果它甚至可能的话。所以我想我会尝试自己实现它。在Windows764位上使用VisualStudioExpress2013RC和在Kubunt

c++ - 在 Clang 中以可移植和最佳方式将 uint64_t 转换为字节数组

如果要转换uint64_t到uint8_t[8](小端)。在小端架构上,你可以做一个丑陋的reinterpret_cast或memcpy(),例如:voidfrom_memcpy(conststd::uint64_t&x,uint8_t*bytes){std::memcpy(bytes,&x,sizeof(x));}这会产生高效的组装:movrax,qwordptr[rdi]movqwordptr[rsi],raxret但是它不是可移植的。它在小端机器上会有不同的行为。用于转换uint8_t[8]至uint64_t有一个很好的解决方案-只需这样做:voidto(conststd::ui

c++ - std::vector<uint8_t> 在启用 C++11/14 时手动复制而不是调用 memcpy

使用gcc4.9,使用Linaro工具链交叉编译ARM,我找到了vector.assign()的编译结果添加-std=c++14时的变化,在某种程度上会产生严重的性能问题。我已经尝试了几种不同的方法来进行这种分配+复制,但是只要我使用std::vector,它们都会有这个性能问题。去做吧。我可以用这个玩具示例重现问题:VectorTest.h#include#include#includestructVectorWrapper_t{VectorWrapper_t(uint8_tconst*pData,size_tlength);std::vectordata;};VectorTest.

c++ - uint128_t 没有命名类型

我正在将一些代码从C移植到C++。在我遇到的转换过程中:uint128_tdoesnotnameatype我的编译器:gcc5.2.1版我的操作系统:Ubuntu15.1这编译得很好,我认为它可以通过包含stdint.h来解决,但事实并非如此。到目前为止,我还没有尝试任何其他方法,因为似乎没有很多关于此错误的信息(example)。uint128_t在整个程序中使用并且对于构建至关重要,因此我无法删除它,并且我不确定是否使用不同的整数类型。以下是使用地点和方式的示例。union{uint16_tu16;uint32_tu32;uint128_tu128;}value;是否可以定义一个u

c++ - 在 x86 机器上移动超过 32 位的 uint64_t 整数未定义行为?

学习艰难,我尝试在x86机器上将longlong和uint64_t左移到32位以上,结果0.我隐约记得在某处读过比32位机器移位运算符仅在前32位上工作但无法记忆来源。我想知道在x86机器上移动超过32位的uint64_t整数是否是未定义行为? 最佳答案 标准说(n1570中的6.5.7):3Theintegerpromotionsareperformedoneachoftheoperands.Thetypeoftheresultisthatofthepromotedleftoperand.Ifthevalueoftherighto

c++ - EASTL与STL,std::vector<uint64_t>::operator[]怎么会有这么大的性能差异

根据http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.htmlvector::operator[]在EASTL中比“常用的STL商业版本”快2%到70%。除非商业版的STL使用范围检查,否则比较不公平,这么简单的操作怎么可能有这么大的速度差异?更新:似乎答案是EA工程师只是通过与使用范围检查的版本进行比较来作弊...... 最佳答案 文档指出他们使用VC++2005进行Windows测试,checkediterators是enabledbydefault(是的

c++ - uint8_t iostream 行为

摘要:我期待代码:cout长版:当我尝试将uint8_t对象流式传输到cout时,我使用gcc得到奇怪的字符。这是预期的行为吗?难道uint8_t是某些基于字符的类型的别名?请参阅代码示例中的编译器/系统说明。//compileandrunwith://g++test-uint8.cpp-std=c++11&&./a.out//-std=c++0x(foroldergccversions)/***printsoutthefollowingwithcompiler:*gcc(GCC)4.7.220120921(RedHat4.7.2-2)*onthesystem:*Linux3.7.9-

c++ - 将 uint8 的 vector 转换为字符串

我有一个指向uint8类型vector的指针。如何获取该指针并将vector中的数据转换为代表其内容的完整字符串? 最佳答案 你可以初始化std::string从std::vector获得的序列:std::stringstr(v->begin(),v->end());没有必要玩任何技巧来检查std::vector为空:如果是,则范围为空。但是,您可能需要检查指针是否为v一片空白。以上要求它指向一个有效的对象。 关于c++-将uint8的vector转换为字符串,我们在StackOverf

c++ - 防止将 uint64_t 转换为 uint16_t

为什么下面的代码在clang++中编译?是否有任何c++标志来防止这种情况发生-我希望编译器抛出错误,因为我将std::uint64_t作为参数传递给接受std::uint16_t的函数。#includeusingnamespacestd;voidfoo(uint16_tx){}intmain(){uint64_tx=10000;foo(x);return0;} 最佳答案 你可以在c++11中删除一个函数voidfoo(uint64_t)=delete;它通过在函数重载解析时添加签名来工作,如果匹配得更好,则会发生错误。您也可以使其

c++ - 为什么在 Mac OS X 上使用 size_t 时 uint32_t 和 uint64_t 之间存在歧义?

考虑以下示例代码:#include#includeusingnamespacestd;intf(uint32_ti){return1;}intf(uint64_ti){return2;}intmain(){cout这在MacOSX上失败:$g++--versioni686-apple-darwin10-g++-4.2.1(GCC)4.2.1(AppleInc.build5664)$maketestg++test.cc-otesttest.cc:Infunction'intmain()':test.cc:23:error:callofoverloaded'f(size_t&)'isamb