jjzjj

c++ - VS2015 无法理解静态内联函数

我在visualstudiomakefile项目的头文件中定义了以下函数,该项目最终使用msys-rtems在c中构建:staticinlineUInt32timer_now(){...其中类型UInt32是来自包含的头文件的typedef:typedefunsignedlongUInt32;由于该功能,我的智能感知出现以下问题:Intellisense建议inline不是类型名称。>错误:变量“inline”不是类型名称Intellisense认为UInt32的定义是这个函数,而不是typedefunsignedlong。如果我删除inline关键字,一切正常(除了我不想这样做,因为

c++ - 移位导致奇怪的类型转换

以下代码在没有警告的情况下编译:std::uint16_ta=12;std::uint16_tb=a&0x003f;但是,与按位一起执行移位会导致“隐式转换警告”:std::uint16_tb=(a&0x003f)gcc和clang都提示存在从int到uint16_t的隐式转换,但我不明白为什么引入移位会导致右watch达式为突然评估为int。编辑:对于clang,我使用-std=c++14-Weverything标志进行编译;对于gcc,我使用-std=c++14-Wall-Wconversion标志进行编译。 最佳答案 在使用整

c++ - STM32 SPI 硬件和严格的别名警告

我已经看到这个主题已经在许多其他问题中进行了讨论,但我无法完全找到我的特定案例的答案。我正在使用STM32F0微Controller。SPI接收/发送FIFO的顶部可通过内存访问访问。这个特殊的微Controller允许我从FIFO的顶部读/写8位或16位。更准确地说,当执行LDRB/STRB指令时,从FIFO弹出/压入8位,当执行LDRH/STRH指令时,从FIFO弹出/压入16位。意法半导体提供的硬件抽象层提出了这种读取SPIFIFO的语法。return*(volatileuint8_t*)&_handle->Instance->DR;//Pop1bytereturn*(volat

c++ - 2 成员结构是否可以安全地替代位压缩 int?

我有一些现有的C++代码可以通过网络发送和接收uint32_t数组。由于我的协议(protocol)发生了变化,我想用一对两个uint16_t替换这个数组中的每个条目,如果可能的话,我想这样做而不改变我发送的位数网络。将两个uint16_t值组合成单个32位宽值的一种明显方法是将低级位打包到uint32_t中,并保持数组定义不变.所以发件人的代码看起来像这样:uint32_titems[ARR_SIZE];for(std::size_ti=0;i(static_cast(field2)(field1));}接收方的代码如下所示://receiveitemsfor(std::size_t

c++ - 将 char 数组的最后 8 个字节设置为 __uint64

我正在通过维基百科上的伪代码实现SHA1算法。它说我应该将原始长度作为64位附加到消息中,所以我尝试了以下操作://new_messageisoftypechar[]andis9+byteslong*((__int64*)(new_message-8))=(__int64)length;这会导致new_message的内存损坏。有人能发现错误吗?谢谢!编辑:天哪,我太傻了。new_message指向我数组的开头,难怪它崩溃了! 最佳答案 new_message-8将从当前指针返回8个字节,这是意图吗?append意味着在末尾添加8个

c++ - cstdint 之外的数字类型

我一直在我的代码中定期使用cstdint的类型(例如uint32_t),但现在它们不太符合我的需求,尤其是在模板方面。有没有办法指定一个两倍于模板参数大小的整数类型?当我的模板传递一个uint32_t时,我需要它为函数内的一个变量创建一个uint64_t。也许更困难的是,当传递一个uint64_t时,我需要它来创建一个“uint128_t”。我可以用两个模板参数的数组来做到这一点,但是我不能将该数组传递给其他模板函数。这是代码的性能关键部分(我正在做密码学)。与此相关,我是否可以包含一些其他header(按优先顺序:标准、提升、其他)给我128位整数?看起来这个问题回答了这个特定部分:

c++ - 继承构造函数仅部分起作用

我有下面的类(class),写成这样,无论typedef是什么,它都能完全工作:classA{protected:typedefucharmDataType;std::vectormData;uint32mWidth;uint32mHeight;friendclassC;public:A();A(void*data,uint32width,uint32height,size_tdataSize);A(constA&other);A(A&&other);A&operator=(constA&other);A&operator=(A&&other)=delete;~A();}我想创建一个子

c++ - 为什么 rand() 在以 1 和 UINT_MAX 为种子时产生相同的值?

这是一些代码:#includeintmain(){srand(1);std::cout这会产生以下输出:1680716807为什么这两个种子会产生相同的结果?它们在连续的rand()调用中产生的整个值序列也是相同的。可能值的范围太大,这不可能是纯巧合。是吗:rand()的执行意外(如果是这样,我很好奇那可能是什么)通过设计(如果是,为什么?)(可能相关:种子10、100、1000、10000和100000分别产生168070、1680700、16807000、168070000和1680700000。) 最佳答案 一个非常简单可用的

c++ - c++11 严格别名规则是否允许通过 char *、char(&)[N]、甚至 std::array<char, N>& 使用 -fstrict-aliasing -Wstrict-aliasing=2 访问 uint64_t?

根据this关于C++11/14严格别名规则的stackoverflow回答:Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughaglvalueofotherthanoneofthefollowingtypesthebehaviorisundefined:thedynamictypeoftheobject,acv-qualifiedversionofthedynamictypeoftheobject,atypesimilar(asdefinedin4.4)tothedynamictypeoftheobject,atypet

c++ - 为什么 _umul128 的工作速度比 mul128x64x2 函数的标量代码慢?

我第二次尝试实现快速mul128x64x2功能。FirsttimeIaskthequestion与_umul128MSVC版本没有比较。现在我做了这样的比较,我得到的结果表明_umul128函数比原生标量和手工simdAVX1.0代码慢。在我的测试代码下面:#include#include#include#include#include#pragmaintrinsic(_umul128)constexpruint32_tLOW[4]={4294967295u,0u,4294967295u,0u};__forceinlinevoidmultiply128x128(constuint32_