草庐IT

C++ 递增 std::atomic_int 如果非零

我正在为引用计数器(如this)使用std::atomic实现指针/弱指针机制。为了将弱指针转换为强指针,我需要以原子方式进行检查强引用计数器是否非零如果是,增加它了解是否发生了变化。有没有办法使用std::atomic_int来做到这一点?我认为必须使用compare_exchange之一,但我想不通。 最佳答案 给定定义std::atomicref_count;intprevious=ref_count.load();for(;;){if(previous==0)break;if(ref_count.compare_exchan

c++ - 使用 typedef'd uint 会导致错误,而 "unsigned int"不会...?

出于某种原因,当我在我的程序中将变量定义为“uint”而不是“unsignedint”时,它会出错。这看起来很奇怪,因为uint被定义为:typedefunsignedintuint;...所以我认为我可以互换使用这两者。更确切地说,我将返回“unsignedint”的函数的结果分配给一个uint变量,然后在vector调整大小调用中使用该uint...此时出错。即,我的代码看起来像这样:unsignedintgetUInt(){return3;}intmain(void){vector>vectVect(100000);for(uinti=0;i&myVect=vectVect[i]

C++:使用int vs struct对静态成员变量进行依赖初始化的静态

给定一个从另一个类的静态成员变量初始化的静态成员变量,非文字structii有时默认初始化为0或到333。这取决于编译或链接顺序。伪代码演示:classStaticClass://file'ONE.cpp/.hpp'staticinti=2staticstructii{inta=333}classABC://file'abc.cpp'staticintabc_i=StaticClass::i//always2staticstructabc_ii=StaticClass::ii//sometimes0,sometimes333调用g++-std=c++11abc.cppONE.cpp&&

c++ - clang 3.5 constexpr 不一致 - 使用 double 而不是 int 时出错

回答后usingboostmathconstantsinconstexpr并建议OP对constexpr变量使用boost的模板化函数而不是非模板化常量来平息clang错误,我决定尝试看看什么条件会重现clang中的错误。让我们尝试复制boost的宏扩展到的内容:namespacedouble_constants{staticconstdoublename=25;}staticconstexprdoubleSEC3=double_constants::name;这会产生以下错误(按照Coliru进行)clang++-std=c++1y-O2-Wall-pedantic-pthreadm

c++ - C/C++ - 为什么在我为单个 int 分配空间时堆如此之大?

我目前正在使用gdb查看低级代码的效果。现在我正在做以下事情:int*pointer=(int*)calloc(1,sizeof(int));然而,当我在gdb中使用infoprocmappings检查内存时,我在我认为是.text部分之后看到了以下内容(因为Objfile显示了我正在调试的二进制文件的名称):...StartAddrEndAddrSizeOffsetObjfile0x6020000x6230000x210000x0[heap]当我所做的只是为单个int分配空间时,堆怎么那么大?最奇怪的是,即使我正在执行calloc(1000,sizeof(int)),堆的大小仍然保持

c++ - 大小小于 int 的位域是否应该作为整体提升的主题?

假设我有以下结构:structA{unsignedinta:1;unsignedintb:1;};我感兴趣的是表达式a+b的类型。虽然从技术上讲,位字段的“类型”大小小于int,因此可能应该进行整数提升,然后结果是int,就像它恰好在gcc和clang中一样。但是由于不可能提取位域本身的确切类型,并且它总是被推断为它的“大”类型(即在这种情况下为unsignedint),积分是否正确晋升应该发生?因为我们实际上无法谈论位域的确切类型和它们的大小,除非它们被推断为unsignedint,在这种情况下不应发生整数提升。(我的问题再一次源于MSVC碰巧认为unsignedint是这种表达式的

c++ - 使用浮点文字初始化 const int

示例intmain(){constinti=1.0;//NoticeIamassigningadoubletoanintherechara[i];}问题用g++-O0-Wall-pedantic-ansi-std=c++11编译上面的代码没有错误(除了未使用的变量)。但是,如果我删除-std=c++11,我会收到以下警告:warning:ISOC++forbidsvariablelengtharray根据thisSOquestion,我相信在C++03中,代码是无效的。但是,有人可以解释一下规则在C++11中发生了什么变化吗?(这个问题是我回答的apreviousquestion的结果

c++ - int ** 与 int [ROWS][COLS]

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:castingchar[][]tochar**causessegfault?我有一个这样声明的二维数组:intarr[2][2]={{1,2},{3,4}};现在如果我这样做:int**ptr=(int**)arr;和:cout我遇到了段错误(使用g++-4.0)。为什么会这样?它不应该打印值1(等于arr[0][0])吗?

c++ - 未定义对 CryptoPP::AlignedAllocate(unsigned int) 的引用

我在c++linux中使用crypto++。这是我的简单代码:#include#include#include#include"crypto++/cryptlib.h"#include"crypto++/modes.h"#include"crypto++/filters.h"#include"crypto++/aes.h"#include"crypto++/osrng.h"#include"crypto++/strciphr.h"usingnamespacestd;usingnamespaceCryptoPP;ifstream::pos_typesize;char*memblock;i

c++ - 从 int 转换为 std::array<unsigned char, 1ul>::value_type 可能会改变其值

编译此程序时,-WconversionGCC参数产生标题中的警告:#include#include#includeintmain(){std::stringtest="1";std::arraybyteArray;byteArray[0]=byteArray[0]|test[0];return0;}这是我编译它的方式:g++--Wall-Wextra-Wconversion-pedantic-std=c++0xtest.cpp我使用的是GCC4.5。我在这里做违法的事情吗?它会在某些情况下引起问题吗?为什么|会产生一个int? 最佳答案