草庐IT

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

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

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++ - 为什么 rand() 在以 1 和 UINT_MAX 为种子时产生相同的值?

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

c++ - 基类重载方法,默认成员变量

我有一个类结构如下:classBase{public:voidsetDefault(uint8_tmy_default){m_default=my_default;}voidmethod(uint8_t*subject){method(subject,m_default);}virtualvoidmethod(uint8_t*subject,uint8_tparameter)=0;protected:uint8_tm_default;};classDerived1:publicBase{public:voidmethod(uint8_t*subject,uint8_tparameter

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++ - 在 C++ 中害怕 uint16?

我正在尝试使用fread从C++中的外部文件读取值。这些值存储为uint16,这在C++中似乎不存在。我做了一些谷歌搜索,发现人们使用typedef来制作他们自己的uint16,但我也想知道我是否可以只使用fread(ptr,uint8,2,file)来读取两个uint8以存储在ptr中。有没有人知道解决这个问题的最佳方法? 最佳答案 固定大小的整数类型,如uint16_t在中定义header。将其包括在内,您就可以开展业务。 关于c++-在C++中害怕uint16?,我们在StackO

C++ 将 long、short 和所有 int 转换为 uint32_t、int32_t 等等有帮助吗?

我运行着一个使用C++编码的游戏服务器,其中还有一些ASM和C。我看到有人更新了我运行的同一台服务器,在所有更新中,所有int、unsigned、short和其他所有内容都已更改为int32_t、uint32_t、uint64_t和其他内容。全部改成上面说的有什么好处吗?假设我将所有int更改为int32_t,并将所有unsignedint更改为uint32_t,当然还有所有其他可能更改的内容。我试图阅读和理解是否有任何好处,但我根本没有理解它们的真正含义。所以,是的,问题是:按照我刚才所说的去做有什么好处吗?我使用的编译器是OrwellDev-C++ 最佳

c++ - 不通过文件系统将 uint8_t* 缓冲区上传到 AWS S3

免责声明:我不是C++程序员,请救救我吧。我正在尝试使用AWS开发工具包在C++中创建PutObjectRequest。我有一个“uint8_t*”(在Java领域,我调用它为byte[],我相信在c++星球上这是一个缓冲区),我需要将它放入Aws::IOStream不知何故。所有示例都显示了直接来自文件系统的数据。我见过几个类似(但不是真的)的问题,其答案指向另一个名为Boost的第三方库,但肯定这是一个常见的用例?为什么我需要第三方库来做一些使用AWS开发工具包应该可以做到的事情?:“我有数据,我想把它放在S3上。不,它不在文件系统中,是的,我在内存中创建了它。”uint8_t*b

c++ - 使用元编程计算非默认模板参数?

我有一个模板类,它接受1到8个整数参数。每个参数的允许范围是0..15。每个参数的默认值16允许我检测未使用的参数。我希望将用户提供的参数数量作为编译时常量使用。我可以使用模板帮助程序类和大量的部分特化来做到这一点。我的问题是,我可以使用一些递归元编程来清理它吗?我的作品有效,但感觉它可以在语法上进行改进。遗憾的是,我无法使用可变参数模板和其他任何c++0x。#include#includetemplatestructCounter{enum{COUNT=8};};templatestructCounter{enum{COUNT=7};};templatestructCounter{e

c++ - 在 C++ 中将十六进制字符串转换为无符号字符

我想将字符串中的十六进制表示形式转换为无符号字符变量,如下所示:std::stringstreamss;uint8_tx;ss>std::hex>>x;//result:x=0x31(=49indecimaland='1'aschar)显然,我假设转换会导致x=0x1f(十进制=31),因为0x1f小于0xff,这是可以存储在8位无符号字符中的最大值。相反发生的是在转换中只使用了我的字符串的前8位。有人可以向我解释为什么会发生这种情况以及如何解决吗? 最佳答案 std::uint8_t是(通常见下文)unsignedchar的别名,