草庐IT

c++ - 两种模板类型的 sizeof,当两者都派生自一个基类时

示例代码#includestructbase{};templatestructleft:base{Typevalue;};templatestructright:base{Typevalue;};intmain(){std::cout=")>=">)>>>>=">>>>)输出GCC4.6是sizeofleft=2sizeofleft>=3sizeofleft>>>>=6使用clang3.1sizeofleft=2sizeofleft>=3sizeofleft>>>>=6使用MSVC2012sizeofleft=1sizeofleft>=1sizeofleft>>>>=1所以,问题是,它

c++ - sizeof(T) 值的标准类型特征

C++11标准指定了一个类型特征std::alignment_of它只返回alignof(T)的值.sizeof是否有类似的特征?运算符(operator)?我只是遗漏了它,还是只是在标准中遗漏了它,或者是否有一些模糊的技术原因未指定它?显然创建这样一个特征是微不足道的,但我无法想象在引入std::alignment_of时不会考虑它.对于上下文,我有一个自定义类型特征,当应用于类型列表时,我用它来获取单个特征的最大值。templateclassTrait,typenameF,typename...T>structtrait_max:std::integral_constant::va

c++ - enable_if + std::less + sizeof... 的组合使 MSVC 失败

这是一个非常简单的代码:template()(sizeof...(Args),3),int>::type*=nullptr>voidtest(std::tuple){}intmain(){test(std::make_tuple(1,2));}它只是简单的函数模板,带有一些enable_if健康)状况。(进一步的SFINAE)。但是它无法在VisualStudio2019withC++17设置中编译。errorC2672:'test':nomatchingoverloadedfunctionfounderrorC2783:'voidtest(std::tuple)':couldnotd

c++ - MSVC 与 GCC 与 sizeof 的行为不一致

考虑以下代码:#includeclassA{public:structB{intM;};staticvoidStaticFunc();};voidA::StaticFunc(){conststd::size_ts0=sizeof(::A::B::M);conststd::size_ts1=sizeof(A::B::M);conststd::size_ts2=sizeof(B::M);}intmain(){conststd::size_ts3=sizeof(A::B::M);return0;}GCCcompilesit,只是警告未使用的变量。但是VisualC++2015无法编译它:er

c++ - sizeof 是否可以在 lambda 中应用于未捕获的变量,或者这是一个编译器错误?

这是讨论的跟进foundhere.以下代码在gcc和clang(livedemo)下编译。对于行//1中的情况,这是令人惊讶的,因为lambda不捕获任何内容。对于MCR2的情况,其中lambda返回指针本身,我们得到预期的编译时错误(行//Willnotcompile)。运算符sizeof的应用与返回指针有何不同?#include#defineMCR1(s)\([](){returnsizeof(s);})()#defineMCR2(s)\([](){returns;})()intmain(){auto*s="helloworld";autox1=MCR1(s);//1autoy1=

c++ - 为什么 sizeof Derived Class 是 8?

#includeusingnamespacestd;classEmpty{};classDerived:virtualpublicEmpty{charc;};intmain(){cout为什么size要来8我觉得应该是9,如果我将“c”声明为整数,那么它也将是8你能给我解释一下逻辑吗 最佳答案 大小依赖于实现,它取决于特定编译器实现如何实现虚拟化和填充。你不应该期望这个值是特定的东西。如果您想在程序中计算大小,只需使用sizeof即可。 关于c++-为什么sizeofDerivedCla

c++ - Visual C++ 中的 sizeof ("...") 让我不开心

我正在写一段代码,其中我使用sizeof("somestring")作为函数的参数,然后我注意到函数没有返回预期值,所以我去看了相应的asm代码,我发现了一个不愉快的惊喜。有人对此有解释吗(见图片)?我知道有1000多种不同的方法可以做到这一点,我已经实现了其中的另一种,但我确实想知道这种行为背后的原因。出于好奇,这是VisualStudio2008SP1。 最佳答案 值5是正确的。该常量包括零终止符字节。监window口中显示的4是看起来不正确的那个。 关于c++-VisualC++中

c++ - Sizeof 在模板中失败,即使类型都已定义

好的,我正在使用g++4.8.2并具有以下(有点长)代码,该代码获取有关不完整类型的错误消息。我已将代码缩减为更小的block以包含在此处,并且可以直接编译:#includestructS{voidmethod(){}};templateclassgenpool{};templateclassmempool{private:genpoolp;};templateclassfunctor{private:staticmempool>pool;};templatemempool>functor::pool;intmain(){typedefvoid(S::*m)();typedeffunc

c++ - 除以 sizeof(void *) 是什么意思?

我在处理哈希表时遇到了这个函数。但是hash/sizeof(void*)是什么意思呢?以及它之后给出的评论-摆脱known-0位?//Thismatcheswhenthehashtablekeyisapointer.templateclasshash_munger{public:staticsize_tMungedHash(size_thash){//TODO(csilvers):considerrotatinginstead://staticconstintshift=(sizeof(void*)==4)?2:3;//return(hash>shift);//Thismattersi

c++ - Sizeof 指向数组的指针

如果我有一个这样声明的数组:inta[3][2];那么为什么是:sizeof(a+0)==8鉴于:sizeof(a)==24我不明白向指针添加0如何改变sizeof输出。是否有一些隐式类型转换? 最佳答案 如果将0添加到a,那么a首先被转换为int(*)[类型的指针值2](指向int[3][2]类型数组的第一个元素)。然后将0添加到其中,将0*sizeof(int[2])字节添加到该指针值表示的地址。由于该乘法产生0,因此它将产生相同的指针值。因为它是一个指针,sizeof(a+0)产生一个指针的大小,在你的盒子上是8个字节。如果你