草庐IT

WPRINTF_SIZEOF

全部标签

c++ - 为什么 C++ 使用 memset(addr,0,sizeof(T)) 来构造一个对象?标准错误还是编译器错误?

这个问题与我的另一个帖子有关:whyallocate_sharedandmake_sharedsoslow在这里我可以更清楚地描述问题。考虑以下代码:structA{chardata_[0x10000];};classC{public:C():a_(){}Aa_;};intmain(){Cc;return0;}我发现对于代码C():a_(),编译器使用memset(addr,0,0x10000)作为A的构造函数。如果类型A有一个空的构造函数,asm代码是正确的。为了更清楚的描述问题,我写了一些测试代码:#includestructA{//A(){}chardata_[0x10000];

c++ - delete my_object 时到底发生了什么;被执行? sizeof(MyClass) 是否将所有其他内存向左移动?

为了这个问题,我将把内存想象成一个简单的字节数组,我将讨论堆内存,因为它可以动态分配。假设我正在实例化某个类,并在已经分配了一些内存的堆上创建一个对象。然后,在创建对象之后,我分配了更多的内存(可能通过实例化另一个类)。当然,这意味着使用new和delete关键字。内存现在看起来是这样的:...bytebytemy_object...my_objectbytebyte...执行deletemy_object;时到底发生了什么?sizeof(MyClass)是否将所有其他内存向左移动?如果有,由谁负责?操作系统?那么当没有操作系统提供虚拟内存时会发生什么? 最

c++ - 为什么 offsetof(member) 等于 sizeof(struct)?

我有一个结构定义为:structsmth{chara;intb[];};当我在此结构上调用sizeof和offsetof时:cout输出是:44为什么stuct的大小是4,char占用1个字节,int数组的偏移量是4?为什么会有某种填充?另外,为什么int数组根本不占用任何空间? 最佳答案 Howcomewhenthesizeofthestuctis4andcharisusing1byte,theoffsetoftheintarrayis4?Whyistheresomekindofpadding?有填充是因为C标准允许;编译器经常对

c++ - 为什么我不能对另一个类的静态 char[] 执行 sizeof?

为什么下面的代码会产生编译错误?编辑:我的原始代码不清晰-我已将代码拆分成单独的文件...First.hclassFirst{public:staticconstchar*TEST[];public:First();};第一个.cppconstchar*First::TEST[]={"1234","5678"};First::First(){uint32_tlen=sizeof(TEST);//fine}确定First类中的大小似乎没问题,但是......第二.hclassSecond{public:Second();};第二个.cpp#include"First.h"Second::

c++ - C/C++ sizeof 运算符 : Why does sizeof( 'a' ) return different values?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Sizeofcharacter('a')inC/C++我是C的初学者,对此感到困惑。C:我尝试使用“%zu”修饰符在C中打印sizeof('a'),它打印出值4。C++:在C++中使用cout打印sizeof('a')和printf(使用上述格式)都打印出值1。我认为正确的值应该是1,因为'a'将被视为字符。为什么它不在C中返回4?两种语言的操作大小是否不同?如果是这样,有什么区别,为什么它会返回不同的值?我在这两种情况下都使用了gcc编译器。

c++ - 为什么 'sizeof' 会给出错误的测量值?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:structsizeofresultnotexpected我有这个C++结构:structbmp_header{//bitmapfileheader(14bytes)charSign1,Sign2;//2unsignedintFile_Size;//4unsignedintReserved_Dword;//4unsignedintData_Offset;//4//bitmapinfoheader(16bytes)unsignedintDib_Info_Size;//4unsignedintImage_Widt

c++ - 为什么 typeid 不像 sizeof 那样是编译时常量

为什么typeid(someType)不像sizeof(someType)那样是常量?出现这个问题是因为最近我尝试了类似的东西:templateclassFoo{static_assert(typeid(T)==typeid(Bar)||typeid(T)==typeid(FooBar));};而且我很好奇为什么编译器在编译时知道类型的大小(sizeof),但不知道类型本身(typeid) 最佳答案 当您处理类型时,您宁愿使用简单的元编程技术:#includetemplatevoidFoo(){static_assert((std:

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

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

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++ - 为什么 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