草庐IT

c++ - ARM 中 16 位大端到小端的快速转换

我需要将16位整数值的大数组从大端格式转换为小端格式。现在我使用以下函数进行转换:inlinevoidReorder16bit(constuint8_t*src,uint8_t*dst){uint16_tvalue=*(uint16_t*)src;*(uint16_t*)dst=value>>8|value我使用GCC。目标平台是ARMv7(RaspberryPhi2B)。有什么办法可以优化吗?加载音频样本需要这种转换,它可以是小端格式,也可以是大端格式。当然现在不是瓶颈,但是占总处理时间的10%左右。而且我认为对于这样一个简单的操作来说这太过分了。 最佳答

c++ - 64bit和32bit进程互通boost::message_queue

大家好,我目前正在尝试找出一种在64位进程和32位进程之间传递数据的方法。由于它是一个实时应用程序并且两者都在同一台计算机上运行,​​因此我很难使用共享内存(shm)。当我在寻找一些使用shm的同步机制时,我对boost::message_queue有所感触。但是它不起作用。我的代码基本上如下:发件人部分message_queue::remove("message_queue");message_queuemq(create_only,"message_queue",100,sizeof(uint8_t));for(uint8_ti=0;i接收部分message_queuemq(ope

C++ 11 未定义对 `__atomic_store_16' 的引用

这个问题在这里已经有了答案:is_lock_freenotdefinedinstd::atomicingcc4.7.2?(1个回答)关闭8年前。以下代码链接失败:#includestructA{unsignedlonga;unsignedlongb;};structB{voidset(Atmp){_a.store(tmp);}std::atomic_a;};intmain(){Bb;b.set(A());return0;}出现以下错误:/tmp/cc8gyaZM.o:Infunction`std::atomic::store(A,std::memory_order)':dryn.cpp

c++ - Delphi:使用调试器调用 C dll 函数需要 15 秒,没有调试器需要 0.16 秒。为什么?

我有以下设置:用DelphiXE5编写并内置Debug64位的Delphi命令行应用程序。用MicrosoftVisualStudio2013编写并内置64位版本的Cdll。Delphi命令行应用程序调用Cdll中的函数。意外情况:在DelphiXE5IDE中调试Delphi命令行应用程序时,Cdll函数调用需要15秒。当直接启动相同的Delphi命令行应用程序(没有IDE,没有调试器)时,Cdll函数调用需要0.16秒。Delphi命令行应用程序源代码:programDelphiCpplibraryCall;{$APPTYPECONSOLE}{$R*.res}usesSystem.S

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++ - 错误 : invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘std::vector<bool>::reference {aka std::_Bit_reference}’

为什么我会收到错误:从类型为“std::vector::reference{akastd::_Bit_reference}”的右值对类型为“bool&”的非常量引用进行无效初始化?vector>vis;bool&visited(intx,inty){returnvis[x][y];//error}据我所知,vector中的operator[]返回引用,所以它应该是一个左值,但它不起作用。我应该怎么做才能让它发挥作用? 最佳答案 那是因为std::vector不是它看起来的样子。std::vector有一个特化与类型bool-它是空间

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++ - IP 标志的 Don't Fragment Bit 在哪里使用?

我很想知道IP标志的“Don'tFragment”[DF]位在哪里使用。由于碎片对更高层是不可见的,他们也不在乎。我也在找例子。非常感谢。 最佳答案 碎片并不总是对所有上层不可见。一些早期的(甚至可能是当前的)微ControllerTCP/IP堆栈没有实现碎片处理等完整功能。在这种情况下使用标志将确保数据包以其原始形式到达,而不是另一端无法处理的大量片段。此外,当使用UDP时,不需要所有的片段都到达目的地,因此,防止片段化意味着消息要么到达要么没有到达——不可能只有UDP数据报的一部分会到达目的地。我不记得TCP/IP堆栈为等待丢失

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

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