首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

sizeof(空类或空结构体)

某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题: VC++里,有一个空类,没有声明任何成员变量或函数,请问此空类占多大字节空间?...          D、8 当时考虑了32bit和64bit机器,并且指针地址是int型,32bit占4个字节或64bit占8个字节,因此选了C和D 后又想想,这没有操作指针,也就不需内存对齐(视VC++编译器会自动进行对齐优化...),排除了C和D,选择了A 当时也考虑过侯捷老师译著的那本《深度探索C++对象模型》,C++中继承与多态在编译器中是如何区分的,所以0字节也不靠谱 但至少也不会仅占一个字节吧,因此当时首先就把B彻底killed...最后,分析为何结果会是:1 这里,先看看C++多态的内部实现 例如,有三个重载函数: int  add(int a, int b); int add(int a, int b, int c); float..._add_int_int _add_int_int_int _add_float_float 编译器压栈记录的是:函数名+参数类型+参数个数(注:返回值类型不足以区分多态) 知道了C++编译器如何处理和区分多态

1.6K30

那些陌生的C++关键字

第二种情况使用情况比较特殊,简单说起来就是在使用类内成员类型的时候。类内成员类型就是在类定义内声明了一个类型,该类型属于类型内部,可见性由权限访问符限定。 下面就是一个类内的成员类型的声明。...通过typename明确的告诉编译器,这里使用的是类型。这样编译器就明确类型T引出的成员是类型,而不是变量或者函数名。因此,typename的使用范围也被限定在模板函数内部。...那么就可以使用mutable声明一个类的成员变量,它告诉编译器类的常成员函数可以修改这个变量。...然而编译优化的技术针对一般的变量都会做出优化,例如: int a=0; int b=a; int c=a+1; 编译器极可能把a放在寄存器中,供b,c的计算使用。...正因为此《C++ Primer》也假设了编译器了的工作方式: int temp=x+1; const int &cy=temp; 如果按照这种工作方式,cx引用的内存单元应该不是x的内存单元,但是在VS2010

96770
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    编译windows版的openJDK攻略

    、依赖项、源码,全部安装、解压完成最少(最少是指只下载C++编译器,不下载VS的IDE)需要超过1GB的空间。    ...JDK中最核心的代码(Java虚拟机及JDK中Native方法的实现等)是使用C++语言及少量的C语言编写的,官方文档中说他们的内部开发环境是在Microsoft Visual Studio C++ 2003...(VS2003)中进行编译,同时也在Microsoft Visual Studio C++ 2010(VS2010)中测试过,所以最好只选择这两个编译器之一进行编译。...由于笔者没有购买Visual Studio 2010的IDE,所以仅仅下载了VS2010 Express中提取出来的C++编译器,这部分是免费的,但单独安装好编译器比较麻烦。...首先执行VS2010中的VCVARS32.BAT,这个批处理文件的目的主要是设置INCLUDE、LIB、和PATH这几个环境变量,如果和笔者一样只是下载了编译器的话则需要手工设置它们,各个环境变量的设置值可以参考下面给出的代码清单

    6K30

    一文掌握C++基本语法

    在学习C语言的时候,我们遇到函数体短小且频繁调用的函数的时候,采用的优化方式是使用宏进行替换,但是宏太繁琐啦,难以看懂,因此c++就产生了内联函数。 那么内联函数是如何进行优化的呢?来看代码。...2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。...:使用auto修饰的变量,是具有自动存储器的局部变量 C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    1.8K10

    为什么Python这么慢?

    就速度而言,Java与C或c++或c#或Python相比如何? 答案在很大程度上取决于您正在运行的应用程序的类型。没有一个基准测试是完美的,但是计算机语言基准测试游戏是一个很好的起点。...十多年来,我一直在参考计算机语言基准测试游戏;与其他语言如Java、c#、Go、JavaScript、c++相比,Python是最慢的语言之一。...这包括JIT (c#, Java)和AOT (C, c++)编译器,以及解释语言,如JavaScript。 注:当我说“Python”时,我指的是该语言的参考实现CPython。...如果引用的数量为0,那么它将从系统中释放那块内存。这就是为什么在for循环的范围内创建“临时”变量不会增加应用程序的内存消耗。 当变量在多个线程中共享时,挑战就变成了CPython如何锁定引用计数。...因为它是动态类型语言 在“静态类型”语言中,必须在声明变量时指定变量的类型。包括C, c++, Java, c#, Go。在动态类型语言中,仍然有类型的概念,但是变量的类型是动态的。

    1.5K20

    编程语言|编译原理

    关于昨天的思考: 编译器的各个步骤有哪些? 能否省略其中某个步骤 编译器是怎样解析代码的? 什么是语法树? 怎样生成目标程序? 语义分析和语法分析有什么不同? 中间代码是怎么生成的?...代码优化有必要么? 什么是三地址代码? 编译器怎样记录源程序中使用的变量的名字? 编译构造工具有哪些? 今天的是讲一讲编程语言,为什么会有这么多不同的编程语言?...当前: 有几千种程序设计语言,分类方式很多,其中按照语言的代可以这样分类: 第一代:机器语言 第二代:汇编语言 第三代:Fortran,Cobol,Lisp,C,C++,C#,Java(高级程序设计语言...第五代:基于逻辑和约束的语言,比如Prolog,OPS5 另外一种分类是分成 强制式语言 C,C++,JAVA,C# 声明式语言 ML,HASKELL,PROLOG 冯诺依曼语言 FORTRAN,C 面向对象语言...C++,C#,JAVA,Ruby 脚本语言 AWK,JavaScript ,Perl ,PHP,Python ,Ruby ,TCL 编程语言和编译器有关系么?

    2K30

    详细剖析 extern C

    【导读】:本文详细解析extern "C"的底层原理与实际应用。 以下是正文 ---- 在你工作过的系统里,不知能否看到类似下面的代码。...比如,在一个编译单元内部,不允许存在同名的函数,无论这个函数是否用static修饰;在一个可执行程序对应的所有目标文件里,不允许存在同名对象,无论它代表一个全局变量,还是一个函数。...A: 链接规范仅仅用于修饰函数和变量,以及函数类型。所以,严格的讲,你只应该把这三种对象放置于extern "C"的内部。...Q: 如果一个带有函数/变量声明的C头文件里没有e x t e r n "C"声明怎么办? A: 如果你可以判断,这个头文件永远不可能让C++代码来使用,那么就不要管它。...+(关键是C++ 提供一个符合 C 调用惯例的函数) 在vs2010上测试时,没有声明什么extern等,只在在cfun.c中包含cppfun.h,然后调用cppfun()也可以编译运行,在gcc下就编译出错

    1.4K30

    【Unity游戏开发】浅谈Lua和C#中的闭包

    其实我们可以把Lua中的闭包和C++中的类做一下类比。闭包是数据和行为的结合体,这就好比C++中的类,有一些成员变量(Lua中的upvalue)+成员方法(Lua中的内嵌函数)。...Iterator(table)函数返回一个匿名函数作为迭代器,该迭代函数会忽略掉传给它的参数table和nil,table和控制变量已被保存在迭代函数中,因此将上面的for循环展开后应该是这个样子: iter...在T1调用返回的匿名委托的代码片段中我们用到了n,而在编译器看来,这些都是合法的,因为返回的委托b和函数T1存在上下文关系,也就是说匿名委托b是允许使用它所在的函数或者类里面的局部变量的,于是编译器通过一系列操作使...如果你想了解C#编译器是如何操作,使得闭包产生的,可以去反编译一下C#程序,然后观察它的IL代码(如何反编译并查看IL代码,马三已经在《【小白学C#】浅谈.NET中的IL代码》这篇博客中做了详细的介绍)...C#的闭包,其实只是编译器对IL代码做了一些操作而已,它仍然没有脱离C#对象生命周期的规则。

    2.5K31

    C++入门知识(二)

    引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。 内联函数对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。...f@@YAXH@Z),该符号在函数 _main 中被引用 8auto关键字 auto是一个C/C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...传统意义上来说,c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.

    53810

    【专业技术】C++里面重要的几个关键字的用法

    volatile关键字 volatile是c/c++中一个鲜为人知的关键字,该关键字告诉编译器不要持有变量的临时拷贝,它可以适用于基础类型 如:int,char,long......也适用于C的结构和C...需要注意的是编译器把MOV指令放到了循环之外。这在单线程中是一个非常好的优化,但是,在多线程应用程序中,如果另一个线程改变了变量的值,则循环永远不会结束。...,地址不会改变,所以地址声明被移动到循环之外。...如此的声明意味着函数不能改变变量的值,但是变量的值却可以被另一个线程在任何时间改变掉。...3arr = 40; 此时,C++的自动型别转换会把40转换成拥有40个元素的Array,并且指派给arr变量,这个结果根本就不是我们想要的结果.如果我们将构造函数声明为explicit,上面的赋值操作就会导致编译器报错

    84770

    C语言入门这一篇就够了-学习笔记

    另外,相对于其他高级语言,比如C++、java、C#等来说,C语言编写的代码运行效率要高。 在介绍C语言的数据类型和基本语法之前,先说说C程序结构和C文件结构。...,作用域为当前文件;修饰函数时表示函数作用域为当前文件内部; 修饰局部变量时,表示该变量为静态局部变量,只被初始化一次,赋值之后值会保持最新的值,也就是说局部静态变量的生命周期被扩展到整个程序运行的时间段内...计算数据类型长度或者变量占内存空间大小,sizeof长得像函数,其实它是个关键字; typedef:为某种数据类型定义一个新的名字; volatile:确保本条指令不会因编译器的优化而省略,且要求每次直接读值...,简单地说就是防止编译器对代码进行优化。...比如如下程序:num=0x65;num =0x66;num =0x67;num =0x68;对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器就不能像对待纯粹的程序那样对上述四条语句进行优化

    61830

    笔记45 | 代码性能优化建议

    选择Static而不是Virtual 常量声明为Static Final 避免内部的Getters/Setters 使用增强的For循环 使用包级访问而不是内部类的私有访问 避免使用float类型 使用库函数...---- 避免内部的Getters/Setters 像C++等native language,通常使用getters(i = getCount())而不是直接访问变量(i = mCount)。...这是编写C++的一种优秀习惯,而且通常也被其他面向对象的语言所采用,例如C#与Java,因为编译器通常会做inline访问,而且你需要限制或者调试变量,你可以在任何时候在getter/setter里面添加代码...然而,在Android上,这不是一个好的写法。虚函数的调用比起直接访问变量要耗费更多。在面向对象编程中,将getter和setting暴露给公用接口是合理的,但在类内部应该仅仅使用域直接访问。...如果你正在性能热区(hotspot:高频率、重复执行的代码段)使用像这样的代码,你可以把内部类需要访问的域和方法声明为包级访问,而不是私有访问权限。

    44260

    编译型语言和解释型语言,动态结构语言和静态结构语言

    编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。编译和执行是分开的,但是不能跨平台。 优点:编译器一般会有预编译的过程对代码进行优化。...主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。 静态结构语言 与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。...(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。...(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++ 是静态类型语言的典型代表,其他的静态类型语言还有 C#、JAVA...其次,如果在程序中明确规定了数据类型,编译器还可以针对这些信息对程序进行一些优化工作,提高程序执行速度。

    9810

    volatile关键字

    volatileC/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。...应对场景:遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化。...volatile也修饰了i,告诉编译器变量极有可能被未知因素更改,每次访问读值都有去内存取值( “volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。)...a,声明为volatile后,说明对变量的访问是显示的,不能从编译器缓存中读取,必须从内存中读取,保证变量的正确性和可见性。...然后定义了一个函数fun(),该函数的作用是循环100000次,每次将变量a的值加1,这个操作是在不同的线程中进行的,因此可能会存在并发问题。

    16710

    C++初阶-入门基础语法

    ,个数,顺序三者满足其中之一即可) 错误示例: 名字修饰 C/C++能否支持重载在于其能否在链接时成功找到对应函数地址,而这又关乎函数名字的修饰规则 注:关于程序如何生成的知识有问题的话,...,省去调用函数额开销,增大空间消耗(代码很长或者有循环/递归的函数不适宜使用作为内联函数) inline对于编译器而言只是一个建议,编译器会自动优化(对于函数体内有循环/递归等的内联,编译器优化时会忽略...auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得 示例: int TestAuto() { return...auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型 使用细则 1.auto与指针和引用结合使用 用auto声明指针类型时,用auto和auto...当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 示例: void TestAuto() {

    71620

    教科书不会讲的C语言关键字volatile用法

    在C/C++嵌入式代码中,你是否经历过以下情况: 代码执行正常–直到你打开了编译器优化 代码执行正常–直到打开了中断 古怪的硬件驱动 RTOS的任务独立运行正常–直到生成了其他任务 如果你的回答是“yes...在程序中循环查看该状态寄存器的值是否变为非0。 下面是最容易想到,但错误的实现方法: 当你打开编译器优化时,程序总是执行失败。...因为编译器会生成下面的汇编代码: 程序被优化的原因很简单,既然已经把变量的值读入累加器,就没有必要重新一遍,编译器认为值是不会变化的。就这样,在第三行,程序进入了无限死循环。...然而,任何像样点而优化都会“break”这段程序。问题是编译器并不知道 etx_rcvd 可能被ISR中被修改。编译器只知道,表达式 !ext_rcvd 始终为真,你讲用于无法退出循环。...结果,循环后面的代码可能被编译器优化掉。 幸运的话,你的编译器可能会发出警告;不幸的话,(或者你不认真的查看编译器警告),你的程序无法正常执行。当然,你可以责怪编译器执行了“糟糕的优化”。

    90320

    为什么 Python 这么慢?

    然而,相比起 Python 扩张的速度,Python 代码的运行速度就显得有点逊色了。 在代码运行速度方面,Java、C、C++、C# 和 Python 要如何进行比较呢?...无论是使用 JIT[2] 编译器的 C#、Java,还是使用 AOT[3] 编译器的 C、C++,又或者是 JavaScript 这些解释型语言,Python 都比它们运行得慢[4]。...这就是在 for 循环代码块内创建临时变量不会增加内存消耗的原因。...这就意味着如果你的程序是多次重复相同的操作时,有可能会被优化器优化得更快。而且,Java 和 C# 是强类型语言,因此优化器对代码的判断可以更为准确。...是因为 Python 是一种动态类型的语言吗? 在 C、C++、Java、C#、Go 这些静态类型语言中,必须在声明变量时指定变量的类型。

    1.5K20

    浅议“全局变量”、“多线程”和“编译器陷阱”

    一开始我也觉得很多余,后来听作者说这段代码可以用到多线程中,有可能正在判断事件变量Started的时候,它有可能被另外的一个线程给改变了,这里引入一个局部变量 handler,可以保留Started之前的对象引用...= null)     { //在这里对obj进行其它处理     } } 上面这段代码在一般情况下没有问题,在多线程下面也工作良好,但如果你启用了编译器优化,很不幸,这段代码被优化成了下面的样子:...原来,这其中有玄机,在.NET平台中,它采用了不同的优化策略,参加原博文中的说法: 如果我说,这样的代码明显是会被编译器优化掉的,因此这样写完全没有意义,怎样呢?...我其实真没有想到那么远,不过CLR Via C#上给出了解释(记不得是哪一章了):JIT的编译器在这里会识别出这个写法并且确保不会把handler变量优化掉。...真是万幸,但估计又成为了一个被学院派的诟病的特性。 参考原文地址: 再说说C#定义事件的写法

    86880
    领券