jjzjj

c++ - GCC 无法矢量化 64 位乘法。可以在 AVX2 上矢量化 64 位 x 64 位 -> 128 位加宽乘法吗?

我尝试对使用64位加宽乘法的CBRNG进行向量化。static__inline__uint64_tmulhilo64(uint64_ta,uint64_tb,uint64_t*hip){__uint128_tproduct=((__uint128_t)a)*((__uint128_t)b);*hip=product>>64;return(uint64_t)product;}这样的乘法在AVX2中是否以vector形式存在? 最佳答案 没有。没有64x64->128位算术作为vector指令。也没有vectormulhi类型的指令(乘

c++ - 有人可以解释使用库 <stdint.h> 中的 uint32_t 的意义吗?

我最近在codechef上看到有人使用这种变量类型和库的代码。我想知道是否有人可以解释使用uint32_t相对于int、float、double等的好处.还有什么情况下应该用/不应该用?代码链接:http://www.codechef.com/viewsolution/131898 最佳答案 优点是uint32_t始终保证为32位长,这与长度取决于平台的原始类型相反。例如,虽然int在x86和x86_64上是32位的,但它们在许多其他64位平台上是64位的,并且比一些旧的和/或嵌入式架构上的要少。使用uint32_t可能有益的情况之

c++ - 明确定义的移位超过 32 位,没有编译器警告

这是一个愚蠢的问题,部分原因是为了好玩。我有一个“明确定义”(或“饱和”?)位掩码函数templateuint32_tmask(uint32_tx){constuint32_tMASK=N>=32?~uint32_t(0):(uint32_t(1)预期行为:uint32_tx=~uint32_t(0);//0xFFFFFFFFmask(x)=>0x000000FFmask(x)=>0x00FFFFFFmask(x)=>0xFFFFFFFFmask(x)=>0xFFFFFFFF但我不喜欢有一个未定义的代码uint32_t(1)在mask()内尽管它100%无害(不应对其进行评估。)我不想

c# - 将 C++ 结构转换为 C# 以用于 UDP 通信

我正在编写一个程序,它将通过UDP与C++程序通信。另一个程序已经写好了(不是我写的)。我得到了一个.h文件,它定义了两个用于数据的结构。编辑:这意味着我无法更改数据格式。我需要能够根据C++.h文件结构进行读写!我如何在C#中执行此操作?我将以这种格式发送和接收数据。structmdata{uint32_tmark_kupnr;uint16_tmark_provnr;uint16_tmarkriktning;uint16_txpos;uint16_typos;};typedefstruct{uint32_tkupnr;uint16_tlngd;uint16_tbredd;uint16

c++ - 找出分数 a/b 的小数点后第 k 位,其中 a,b,k 是非常大的整数(小于 10e18)

我的任务是找到分数(a/b)小数点后第k位的数字。昨天我发现了这个算法。为了获得小数点后的任何数字,我生成了一个名为rem的变量并进行了循环for(inti=1;i循环将返回一个值,该值是小数点后的第k位。但是这个任务要求我用a,b,k计算非常大的数(小于或等于10e18),所以代码肯定会超过时间限制。找出重复前的数字个数。它是分母中因数2和5中较大的一个。如果k不超过位数,运行for循环。否则,我们仍然会运行for循环到k+1。将除法的余数存储在变量x中。用上面相同的内容运行一个while循环,直到余数再次具有x的值。此后,将除法的每一个商存储到一个名为qut的数组中。while循环

c++ - 模板类静态在最终二进制文件中是否在共享库中以不同方式实例化?

我有几个类充当唯一类型ID生成器://templatestructComponent{staticuintconstindex;};templateclassComponentCount{templatefriendstructComponent;private:templatestaticuintnext(){returnComponentCount::get_counter();}staticuintget_counter(){staticuintcounter=0;returncounter++;}};templateuintconstComponent::index(Compo

c++ - std::memcpy 或显式 char 值赋值 - 在 C++ 中相等且合法

在下面的示例中,uint32_t的值表示被复制到uint8_t数组。这是由std::memcpy完成的。据我了解C++标准,这是完全合法的:我们通过转换为unsignedchar*的T*访问类型为T的对象。没有别名问题,没有对齐问题。反之则不太明显。我们正在通过unsignedchar*访问T的对象表示,这是合法的。但是访问这个词包括改变吗?当然没有锯齿和对齐问题。然而,如果缓冲区s中的值来自外部来源,则会出现问题:我们必须确保正确的字节顺序并省略陷阱表示。可以检查正确的字节顺序,这样就可以解决。但是陷阱表示呢?我们怎样才能避免这种情况?或者uint类型没有陷阱表示而不是说double

c++ - 这些整数是否未对齐,我应该关心吗?

我有一些代码可以从任意地址的字节数组中解释多字节宽度的整数。std::vectorm_data;//filledwithdatauint32pos=13;//positionthatmightnotbealignedwellfor8byteintegers...uint64*ptr=reinterpret_cast(m_data.data()+pos);*ptr=swap64(*ptr);//(swapsendianness)对齐会成为这段代码的问题吗?如果是,这是一个严重的问题,还是可以放心忽略的问题,因为惩罚微不足道? 最佳答案

c++ - 是否有一个 vector 可以处理非标准位长的整数?

我正在寻找类似于STLvector但可以处理整数的东西,例如12、16、20、24、32和40位长。vector很好地处理了16位和32位的情况。和vector,但我还没有找到任何方法来处理其他的。请注意,这样做的全部目的是节省内存和带宽,因此填充不是一种选择。我的数据结构可以推断出整数的最高有效位(即int64),因此我只想存储LSB。每整数位数和整数个数在创建时已知,但在编译时未知。理想情况下,每整数位数可以是12到40之间的任何值,但出于性能原因或使用需要在编译时设置每整数位数的结构,层是可以的。vector和dynamic_bitset可以创建位域,但它们仅限于1位整数。有人知

c++ - 你能自动写两个 uint64_t 吗?

我有一个问题,我需要能够自动更新两个uint64_t的同时。以原子方式编写它们中的每一个是很容易的(例如,有两个std::atomic的),但这仍然会导致更新一个而另一个不更新的情况。使用锁和互斥锁也很容易实现。但我想以原子方式编写,没有任何类型的锁,这样我仍然可以拥有类型为uint64_t的成员变量。这样就不会锁定读取。这是因为我的用例涉及读取它们很多很多次,但很少写入它们(~读取1x/ms,写入1x/5分钟)。可能吗?如果是这样,如何? 最佳答案 对于std::atomic标准说(强调我的)Theprimarystd::atom