我现在正在测试C++的结果sizeof运算符(operator):classS{};classA:publicS{virtualvoidfun()=0;};classB{};classC:publicB,publicA{};intmain(){cout但是如果我删除类S的扩展:classA{virtualvoidfun()=0;};classB{};classC:publicB,publicA{};intmain(){cout谁能解释sizeof(C)输出的不同之处?在这两个例子中?类S只是一个空类(我知道,sizeof(S)==1),那么为什么A会有所不同呢?有基类吗?特别是因为它对
#includeusingnamespacestd;structnode1{charb[3];intc[0];};structnode2{intc[0];};structnode3{charb[3];};intmain(){cout我的问题是为什么编译器在node2中为intc[0]分配0字节但为其when节点1的一部分分配1个字节。我假设这1个字节是sizeof(node1)返回4的原因,因为没有它(就像在node3中)它的大小是3还是由于填充?还试图理解node2不应该有足够的空间来保存指向数组的指针(作为灵活数组/结构hack的一部分,它将在代码的更下方分配?
我知道在C++中,您可以通过以下方式获取行和列的数组数量:introws=sizeofarray/sizeofarray[0];intcols=sizeofarray[0]/sizeofarray[0][0];但是有没有更好的方法来做到这一点? 最佳答案 在C++11中,您可以使用模板参数推导来完成此操作。似乎extenttype_trait已为此目的存在:#include//...introws=std::extent::value;intcols=std::extent::value;
我注意到允许使用lambda中未捕获的变量的编译时特性,例如调用sizeof、decltype函数,例如:#includevoidf(){}intmain(){inty=13;autox=[]{returnsizeof(decltype(y));};std::cout因为g++和clang++都能正确编译这个程序,我猜这是标准允许的。虽然我想不出任何特定的恶意案例会导致错误,但这对我来说似乎有点误导。但我想知道此功能的实际用例是什么? 最佳答案 您可能会使用它的一个简单示例是,如果您有一个lambda,您希望在其中执行与y相同类型的
给定代码:classA{};classB:publicvirtualA{};classC:publicvirtualA{};classD:publicB,publicC{};intmain(){cout输出:sizeof(D)8每个类都包含自己的虚指针,但不包含其任何基类的虚指针,那么,为什么class(D)的Size是8? 最佳答案 这取决于编译器的实现。我的编译器是VisualStdioC++2005。代码如下:intmain(){cout会输出sizeof(B):4sizeof(C):4sizeof(D):8B类只有一个虚指针
我有一种奇怪的感觉,好像这是最近才出现的问题,并且发生在两台不同的计算机上。当我调试并尝试查看来自STL的std::string的值时,它显示为值。它说它的大小是15,容量是一些乱码。数组值本身都显示CXX0030:错误:无法计算表达式。这非常令人沮丧,如果我在字符串上调用c_str并将其分配给char*或在需要时使用监视表达式,我仍然可以在调试时访问字符串值,但它非常乏味并且让生活变得非常艰难连续3天调试复杂问题。其他STL容器的内容显示得很好。这发生在两台不同计算机上的多个项目上,我很确定我已经为该项目设置了所有调试选项。没有优化,肯定会生成调试信息。
我预计对于最大8字节的结构没有什么不同,但是更大的POD类型呢?当类型的大小超过机器字大小时,按值传递是否会变得更昂贵,或者是否有其他因素(如缓存行大小)会影响性能?我主要对x64感兴趣,但也可以随意包含一些x86的数字。说明:我可能想得太狭隘了,因为我不知道在其中发挥作用的所有因素(寄存器、调用约定、编译器优化)。我主要对Microsoft的C++编译器感兴趣,它只使用__fastcall。我感兴趣的是,在了解架构、类型大小、缓存大小等参数传递方面,是否有任何一般性建议。例如:“当类型小于N字节时,最好按值传递类型。“其中N是可以从我们已知的事物中推导出来的事物。
我希望这不是一个重复的问题,但我已经进行了一些详细搜索,但之前没有找到我的确切案例。我有一个简单的结构,我也希望能够将其作为简单的字节数组进行访问union{struct{unsignedchara;unsignedcharb;//...Someothermembers...unsignedcharw;};unsignedcharbytes[sizeof(what?)];}myUnion;请注意,该结构没有命名,也没有给它自己的成员名称。这样我就可以使用myUnion.a访问该成员,而不是myUnion.myStruct.a。但是,如果没有一些名称,除了每次更改内容时手动计算之外,我如
给定structFoo{uint32_ta;uint32_tb[];};什么是sizeof(Foo)?它是实现定义的还是未定义的行为?C与C++的答案是否不同? 最佳答案 编译器将忽略灵活数组成员,因为它不存在。C11-§6.7.2.1(p18)[...]Inmostsituations,theflexiblearraymemberisignored.Inparticular,thesizeofthestructureisasiftheflexiblearraymemberwereomittedexceptthatitmayhave
假设我有一个类Base,它有N个子级,Derived0,Derived1,...,DerivedN。我正在尝试为从Base继承的对象创建一个池分配器,并且实现依赖于了解Base的最大子级的大小,因为每个池都是大到足以容纳这些物体之一。这是一个包含普通类和N=2的简单示例。实际上,N可能更大,Base的子级可能不是简单的POD类。classBase{public:virtual~Base()=0;};classDerived0:publicBase{inta;};classDerived1:publicBase{inta,b;};classDerived2:publicBase{inta