草庐IT

c++ - 为什么sizeof()编译器返回的值是依赖的?

structA{charc;doubled;}a;mingw32-gcc.exe中的:sizeofa=16在gcc4.6.3(ubuntu)中:sizeofa=12为什么它们不同?我认为应该是16,gcc4.6.3是否做了一些优化? 最佳答案 如果需要,编译器可能会为目标体系结构执行数据结构对齐。这样做可能纯粹是为了提高应用程序的运行时性能,或者在某些情况下是处理器需要的(即,如果数据未对齐,则程序将无法运行)。例如,大多数(但不是全部)SSE2指令要求数据在16字节边界上对齐。简而言之,计算机内存中的所有内容都有一个地址。假设我们

c++ - 通过指向指针的指针访问结构元素的地址

假设我有一个结构:structABC{chara;charb;charc;}我可以将指向上述结构的指针声明为:结构ABC**abc现在abc是一个指向结构指针*abc的指针,而*abc是一个指向结构的结构指针美国广播公司。因此;sizeof(**abc)将为4,sizeof(*abc)也将为4而sizeof(abc)将为3(考虑指针大小为4个字节,字符大小为1个字节)。我的问题是:如何使用上面声明的abc声明一个指向成员变量c的字符指针? 最佳答案 sizeof(**abc)willbe4,sizeof(*abc)willalsob

c++ - arr[0] 的大小怎么是 8 个字节?

我正在浏览寻找一种方法来查找给定矩阵中的行数和列数,而无需任何其他信息,我找到了这个答案。Givenamatrix,findnumberofrowsandcolumns这是上述问题的第二个答案的代码片段:intmain(){floata[9][2]={{0,1},{1,1}};introw=(sizeof(a)/sizeof(a[0]));intcol=(sizeof(a)/sizeof(a[0][0]))/row;printf("%d\n",row);printf("%d\n",col);return0;}sizeof(a[0])是怎么变成8的?在我的理解中,指针的通用大小在32位架

c++ - 在 std::conditional 中使用不完整类型的 sizeof

这是一个最小的例子:structincomplete_type;templatestructfoo{usingtype=std::conditional_t,std::conditional_t,double>;};foof;会导致错误,因为它会对类型执行sizeof,即使incomplete_type不是算术类型(iow,它不会在逻辑上进入sizeof分支)。livedemo所以,我想推迟sizeof:第一次尝试(失败)templateautofoo_aux(){if(sizeof(T)conditional_t,decltype(foo_aux()),double>仍然触发相同的错

c++ - 数组 C++ 中每个 boolean 值 1 位

boolfp[81];根据我的理解,fp应该使用ceil(81/8)字节,因为它是连续的。我说的对吗?我怎样才能证明这一点? 最佳答案 不,缓冲区的大小是实现定义的。请引用以下标准中的引述。因此,您可以期望的大小是81*X,其中X是bool的大小,它是实现定义的。$5.3.3/1-“sizeof运算符产生其操作数的对象表示中的字节数。操作数是一个未计算的表达式,或者是带括号的类型ID。sizeof运算符不应应用于具有函数或不完整类型的表达式,或在声明其所有枚举数之前应用于枚举类型,或应用于此类类型的括号名称,或应用于指定的左值一个位

c++ - 为什么 sizeof(!0) 打印 1 而不是 4?

#includeintmain(){std::cout这里,sizeof(0)在C++中是4,因为0是一个整数右值。但是,如果我这样写:std::cout这里,sizeof(!0)是1。但是,!0表示它打印1,这也是int类型。那么,为什么sizeof(!0)打印1而不是4?我在这里想念什么? 最佳答案 logicalnegation运算符(operator):!rhsIftheoperandisnotbool,itisconvertedtoboolusingcontextualconversiontobool:itisonlywe

c++ - C 和 C++ 中 sizeof 运算符的不同输出

C和C++中sizeof()运算符的不同输出。在C中:intmain(){printf("%zu\n",sizeof(1==1));return0;}输出:4在C++中:intmain(){std::cout输出:1问题:为什么输出不同?sizeof是否独立于操作系统或编译器?是否取决于语言? 最佳答案 根据N1570草稿(c11):6.5.9相等运算符The==(equalto)and!=(notequalto)operatorsareanalogoustotherelationaloperatorsexceptfortheirl

c++ - 多重继承的虚函数表

示例代码如下:classA{public:intk;virtualintf();};classB:publicvirtualA{public:virtualinta();};intmain(){cout打印812似乎B类有自己的新虚函数表。如果A类更改为:classA{public:virtualintf();};打印44谁能解释一下原因? 最佳答案 在您的子类B中,B是A的虚拟子类。因此,B在子对象A的指针之上有一个单独的vtbl指针(4字节)。因此,sizeof(Bobject)=sizeof(Aobject)+sizeof(v

c++ - 当我从虚拟基派生 D 时,为什么 VS2015 中的 sizeof(D) 增加了 8 个字节?

我正在使用C++14§3.11/2中的示例:structB{longdoubled;};structD:virtualB{charc;}在clang、g++和VS2015中运行下面的代码片段之后#includestructB{longdoubled;};structD:/*virtual*/B{charc;};intmain(){std::cout我得到了以下结果:clangg++VS2015sizeof(longdouble)16168alignof(longdouble)16168sizeof(B)16168alignof(B)16168sizeof(D)323216alignof

c++ - sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候可以不同?

什么时候可以sizeof(size_t)和sizeof(ptrdiff_t)有区别吗?有这方面的真实示例吗?注意,我知道所有标准都说这些类型是实现定义的。但是我知道的所有实现,sizeof(size_t)和sizeof(ptrdiff_t)等于。也许出于某些奇怪(或不太奇怪)的原因,它们可能会有所不同。看来,sizeof(ptrdiff_t)这不是一个非常有用的情况,因为指针运算对于大型数组来说非常有限。另一种情况,sizeof(ptrdiff_t)>sizeof(size_t)可能有点用处,因为所有指针减法都将在数组上定义(如果数组大于PTRDIFF_MAX,则指针减法将为所有远距离