现在我正在谈论程序员使用typedef关键字定义的新类型。只要我的学生习惯了size_t类型(例如通过使用函数length()),我不得不让他们稍微努力“相信”它是一个整数类型,我认为它会很棒向他们展示这种类型的定义位置。所以,我在Ubuntu机器中的/usr/include中做了很多grep,我看到size_t是size_type的重新定义,而size_type又是metadata_type的重新定义,这就是在这个目录下结束。没有找到最终的“typedefunsignedintmetadata_type;”。在/usr/src中,我发现了另一个名为yy_size_t的先前类型,...
考虑以下示例代码:#include#includeusingnamespacestd;intf(uint32_ti){return1;}intf(uint64_ti){return2;}intmain(){cout这在MacOSX上失败:$g++--versioni686-apple-darwin10-g++-4.2.1(GCC)4.2.1(AppleInc.build5664)$maketestg++test.cc-otesttest.cc:Infunction'intmain()':test.cc:23:error:callofoverloaded'f(size_t&)'isamb
我需要一种简单的方法来获取T类对象的计数/长度/大小在哪里T是某种集合类型,例如std::map,std::list,std::vector,CStringArray,CString,std::string,……对于大多数标准类型,T::size()是正确答案,对于大多数MFC类T::GetSize()是正确的,对于CString,是T::GetLength().我想点个赞:templateautosize(constT&t)...计算出正确的成员函数调用。似乎应该有一种简单的方法来调用T上的特征模板其中有一个size(constT&t)成员,它本身使用SFINAE存在或不存在,如果存
以下代码:std::arrayarr1;std::arrayarr2;...用gcc和clang编译因为std::array::size被认为是constexpr。但以下内容不能用gcc(版本5.3.020151204)编译:std::array,4>arr1;std::array,arr1.size()>arr2;对我来说,如果第一个代码有效,则没有理由编译失败,但由于我没有找到很多关于此的帖子,我不知道它是否是gcc错误或clang扩展?gcc的错误(我不太明白...):main.cpp:Infunction'intmain()':main.cpp:6:46:error:callt
C99/C++11标准是否保证sizeof(size_t)==sizeof(void*)总是正确的?size_tf(void*p){return(size_t)(p);//Isitsafe?}void*f(size_tn){return(void*)(n);//Isitsafe?} 最佳答案 不,不能保证。使用intptr_t或uintptr_t将指针安全地存储在整数中。存在/曾经是错误的架构是有意义的,例如分段DOS内存模型。那里的内存是由64k段构成的——一个对象永远不会大于一个段,所以16位size_t就足够了。但是,指针具有
我最近发布了一个有关由于C++中的虚拟性而导致的内存开销的问题。答案使我了解了vtable和vptr的工作原理。我的问题如下:我在super计算机上工作,我有数十亿个对象,因此,由于虚拟性,我必须关心内存开销。经过一些措施,当我将类与虚函数一起使用时,每个派生对象都有其8字节的vptr。这一点一点都不能忽略。我不知道英特尔icpc或g++是否具有某些配置/选项/参数,以使用精度可调的“全局”vtable和索引而不是vptr。因为这样可以让我为2亿个对象使用2字节的索引(无符号shortint)而不是8字节的vptr(这样可以大大减少内存开销)。有没有办法用编译选项来做到这一点(或类似的
我有以下C++函数定义,我试图通过PInvoke从托管代码中调用它:boolFooBar(SIZE_T*arg1);我的托管声明如下所示:[DllImport("mydll",SetLastError=true,CharSet=CharSet.Unicode)]privatestaticexternboolFooBar(refuintarg1);你们中的一些人可能会注意到我最终遇到的相同错误。这不是64位可移植的。SIZE_T的大小可变(32-64位),指向它的指针也是如此。在托管大小上,指针正确转换为64位,但uint没有,您最终可能会在arg1的高位中出现垃圾。这是一个特别持久的错
std::vector::size()返回一个无符号的size_type,通常与size_t相同,例如在64位平台上是8个字节。相比之下,QVector::size()返回一个int,即使在64位平台上通常也是4个字节,并且它是有符号的,这意味着它可以只走到2^32的一半。这是为什么呢?这似乎很不合逻辑,而且在技术上也有限制,虽然您可能需要超过2^32个元素的可能性也不大,但使用有符号int会毫无理由地将该范围缩小一半。也许是为了避免对那些懒得将i声明为uint而不是决定让所有容器返回大小类型的int的人发出编译器警告这没有任何意义是更好的解决方案吗?原因不可能这么傻吧?
通过阅读与size_t和ptrdiff_t相关的在线帖子,我想确认以下几点:如果数组的最大大小小于1/2*(maxnumberrepresent-ablebysize_t),我可以安全地使用ptrdiff_t并且检查指向同一个对象的两个指针之间的相对距离?(因为我说的是数组,所以“指向同一个对象的指针”是指“指向同一个数组的指针”)。如果我想声明一个可以表示与另一个指针的偏移量的变量,我最好将其声明为类型ptrdiff_t?如何在C和C++中输出size_t和ptrdiff_t类型的变量?以下是否正确:Crossplatformformatstringforvariablesoftyp
C++标准是否保证(通过明确声明或通过逻辑推导隐含)std::uintmax_t可以保存std::size_t的所有值?或者std::numeric_limits::max()有可能吗?大于std::numeric_limits::max()? 最佳答案 是的。size_t被定义为无符号整数类型,大到足以包含任何对象的大小。uintmax_t被定义为能够存储任何无符号整数类型的任何值。所以如果size_t可以存储,uintmax_t可以存储。size_t的定义来自C++11§18.2:Thetypesize_tisanimpleme