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

为什么C和C++中相同代码的对象文件大小会发生变化

这个问题涉及到C和C++编程语言的编译过程、链接过程以及目标文件和可执行文件的差异。我们将分别解释这些概念,并解答为什么相同代码的对象文件大小会发生变化。

  1. 编译过程:C和C++编程语言在编译过程中,源代码会被转换成目标文件(.obj文件)。目标文件包含了源代码的机器代码、符号表和重定位信息。
  2. 链接过程:链接器会将多个目标文件链接成一个可执行文件(.exe文件)。在这个过程中,链接器会解析目标文件中的符号表和重定位信息,将它们合并成一个完整的程序。
  3. 目标文件和可执行文件:目标文件是编译过程的产物,它包含了源代码的机器代码、符号表和重定位信息。可执行文件是链接过程的产物,它包含了程序的完整代码和数据,可以直接在操作系统上运行。
  4. 对象文件大小变化的原因:相同代码的对象文件大小可能会发生变化,原因如下:

a. 优化级别:编译器在编译过程中会根据优化级别对代码进行优化。不同的优化级别会导致生成的目标文件大小不同。

b. 调试信息:编译器在生成目标文件时,可以选择生成调试信息。这些调试信息可以帮助开发者调试程序,但会增加目标文件的大小。

c. 目标平台:不同的目标平台(如32位和64位)会导致生成的目标文件大小不同。

d. 静态库链接:如果使用静态库链接方式,链接器会将静态库中的所有代码和数据都包含在可执行文件中。这会导致可执行文件的大小变大。

e. 动态库链接:如果使用动态库链接方式,链接器会将静态库中的符号表和重定位信息包含在可执行文件中。在程序运行时,动态库会被加载到内存中,这会导致可执行文件的大小变小。

总之,相同代码的对象文件大小可能会发生变化,这是由于编译器、链接器和目标平台等因素的影响。在实际开发中,开发者可以根据需要调整编译器和链接器的选项,以生成合适大小的目标文件和可执行文件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中类的真身和对象的构造(一)

其实这里还有很多c++的知识点没有讲解到,暂时是分享面向对象语言的重点(后期会补上那些基础知识点);其实面向对象的思想也是可以用c语言写出来的(虽然说c语言是一门面向过程的语言,但是c语言真的很博大精深...c语言里面的结构体,现在毕竟在学习c++,所以还是多用class,同时这也就能解释为啥c语言能够写出面向对象的思想了): 在使用struct定义类时,所有成员的默认访问级别为public(也就是说,外部的对象可以调用和访问类里面的东西...(上面的例子几乎是用c++里面的知识来写的,其中using namespace std,以及cout这些暂时先在这里不介绍,就先知道cout和c语言里面的printf函数一样,用来打印输出的就行了,这几天之内会介绍的...2、其实一般来说对象访问类里面的属性都要有一个初始化,在c++里面有一一个构造函数,就可以解决对象访问类中的属性初值问题,就不用管第一条说的那样(分栈、堆啥的),那我们怎样使用构造函数呢?...首先我们要明白构造函数的定义: C++中可以定义与类名相同的特殊成员函数,这个特殊成员函就是构造函数了。 构造函数没有任何返回类型的声明。 构造函数在对象定义时自动被调用。

43220

C++天使的灵动心跳代码:类和对象(中上)

本篇将介绍类和对象中的重点部分,六大函数中的前四个尤为重要,所以这部分篇幅或许会有点长,所以请各位读者们耐心看完,相信看完会有不一样的收获 1.类的六大默认成员函数 一个类里面如果什么都没有,就被叫做空类...而是初始化对象 其语法形式为: 类名 () {} 值得注意的是: 函数名与类名相同 无返回值 对象实例化时编译器自动调用对应的构造函数 构造函数可以重载 在开空间和释放空间特别好用,因为自动调用,...内置类型(如int、double、char等)在 C++ 中是语言本身提供的基本数据类型,它们的初始化相对简单直接,它们不像类类型对象那样,有复杂的成员变量和可能需要执行的构造函数来完成初始化 举个例子...若未显式定义,系统会自动生成默认的析构函数,注意:析构函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数 3.1 默认析构函数 对于只包含基本类型(如int、double、char等)...Time 类的对象,为什么最后会调用 Time 类的析构函数?

4500
  • C++天使的灵动心跳代码:类和对象(中下)

    const 修饰),在用已存在的类类型对象创建新对象时由编译器自动调用 其语法形式为: 类名 (const 类名& 对象名) {} 为什么一定要引用传参呢?...默认拷贝构造函数会对类中的每个成员进行简单的复制,如果对于数据只是可读的话,直接浅拷贝即可;如果对于数据是读写的话,就需要深拷贝了 深浅拷贝概念传送门:C++命运石之门代码抉择:C++入门(中)——3.2.4...引用的使用 值得注意的是:MyString s2(s1) 和 MyString s2 = s1 是等价的 4.2 显式调用拷贝构造函数 显式调用拷贝构造函数是指在代码中通过明确的语法形式来触发拷贝构造函数的调用...5.2 const 取地址运算符重载函数 取地址运算符重载函数是对取地址运算符(&)进行重载的函数,在 C++ 中可以通过重载它来改变获取对象地址这一操作的默认行为。...因为 const 成员函数不会修改对象的数据成员,所以在非 const 成员函数中调用它是完全合法的,并且这种调用方式在实际编程中很常见 总结:主要看被调用的函数有没有可能会修改对象的数据成员 希望读者们多多三连支持

    6510

    【C++类和对象(中)】—— 我与C++的不解之缘(四)

    前言: 接下来进行类和对象中的学习,了解类和对象的默认成员函数 一、类和对象默认成员函数         默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数。...1.1.1、构造函数的特点 构造函数的特点如下: 1、函数名和类名相同。 2、无返回值(返回值不需要写,void也不需要)。 3、对象实例化时系统会自动调用对应的构造函数。...4、构造函数可以重载 5、如果类没有显示定义构造函数,C++编译器会自动生成一个无参的默认构造函数;如果显示写了构造函数,编译器就不会再生成。...1.3.1、拷贝构造的特点 1、拷贝构造函数是构造函数的一个重载。 2、C++规定,自定义类的对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参和传值返回都会调用拷贝构造完成。...C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。 2、运算符重载是具有特殊名字的函数,他的名字是由operator和后面要定义的运算符共同构成。

    11010

    C++天使的灵动心跳代码:类和对象(下)

    类和对象内容的大致框架已经基本学得差不多了,本篇是对 类和对象的部分补充,帮助我们更深入理解 1...., _month(month) , _day(day) {} private: int _year; int _month; int _day; }; 按照代码中初始化列表里的顺序...return 0; } 自动调用 MyClass 的以 int 为参数的构造函数,将 10 转换为 MyClass 类型的对象,这种隐式转换有时候可能并非程序员的本意,而且可能会导致一些不易察觉的错误或者代码逻辑不够清晰...• 友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元 • 友元关系不能继承,在继承位置再给大家详细介绍 4.内部类 如果一个类定义在另一个类的内部,这个内部类就叫做内部类...sizeof(外部类)=外部类,和内部类没有任何关系 希望读者们多多三连支持 小编会继续更新 你们的鼓励就是我前进的动力!

    4300

    【C++指南】类和对象(六):类中的static成员

    引言 在C++编程中,static关键字是一个功能强大的工具,它可以应用于变量、函数以及类成员。 当static关键字用于类成员时,它赋予了这些成员一些特殊的性质和行为。...本文将详细介绍C++中static成员的概念、特性、用法以及它们在实际编程中的应用。 一、static成员的定义 在C++中,static成员分为static变量和static方法(函数)。...访问限制: 静态成员也是类的成员,受public、protected、private 访问限定符的限制 总结 C++中的static成员为程序员提供了一种强大的机制,用于实现类级别的共享数据和功能。...通过合理使用static成员,可以提高代码的可读性、可维护性和性能。然而,也需要注意static成员带来的潜在问题,如多线程环境下的同步问题和内存管理问题。...通过深入理解static成员的工作原理和特性,可以更好地利用这一工具,编写出更加高效和健壮的C++程序。

    16410

    C++继承中的对象模型与继承中构造和析构顺序

    继承中的对象模型 问题:从父类继承过来的成员,哪些属于子类对象中?...示例: class Base { public: int m_A; protected: int m_B; private: int m_C; //私有成员只是被隐藏了,但是还是会继承下去 };...打开工具窗口后,定位到当前CPP文件的盘符 然后输入: cl /d1 reportSingleClassLayout查看的类名 所属文件名 效果如下图: 结论: 父类中私有成员也是被子类继承下去了...,只是由编译器给隐藏后访问不到 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构造和析构顺序是谁先谁后?...<< endl; } }; void test01() { //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 Son s; } int main() { test01

    58020

    c++中对象和类的关系_类的对象只能访问该类的私有成员

    类以及类和对象的关系以及类的访问修饰符 一.类的概念: 二.类和对象的关系: 三.类的组成: 四.类的创建: 五.类的访问修饰符: 一.类的概念: 类是对于某一类对象的一个统称,类是对象的抽象化,对象是类的实例...二.类和对象的关系: 类就是对象的抽象化概念,一个类就是一个对象集合的总称,通俗的来讲就是对象需要什么这个类就提供什么给对象,加入对象需要什么数据这个类就提供什么数据,对象需要什么功能这个类就提供什么功能...所有类或成员,任何代码均可访问该项,访问权限最大也就意味着最不安全 Private访问修饰符:范围:私有的,只有类的内部可以进行访问,允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。...只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。...类和内嵌类的成员,只有派生类可以访问该项; Internal访问修饰符:范围:内部的,默认的,程序集内部可以访问,允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。

    1.7K10

    【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

    一、继承中的对象模型分析 1、继承代码示例 下面有 3 个类 , 分别是 A 类 , B 类 , C 类 ; A 类是 基类 ; B 类 公有继承 A 类 , 并定义了新的 成员变量 y ; C 类...成员 , 在内存中是 2 个 int 类型的空间 ; C 类对象 objC 中 , 除了继承自 B 类的 int x 和 int y 成员 , 还有一个自己的 int z 成员 , 在内存中是 3 个...int 类型的空间 ; 3、问题引入 - 派生类对象构造函数和析构函数调用 上述 继承 的过程中 , 每一层继承 , 都继承了上一级 父类的 成员变量 , 同时自己也定义了新的成员变量 ; 在 派生类对象...system("pause"); return 0; } 二、继承中的构造函数和析构函数 ---- 1、子类构造函数与析构函数调用顺序 继承中的构造函数和析构函数 : 子类构造 : 子类对象 进行...public: B(int a, int b) : A(a) { this->y = b; cout << "B 构造函数调用" << endl; } } 3、代码示例 - 继承中的构造函数和析构函数

    24540

    【C++】多态 ② ( 面向对象中 “ 多态 “ 的真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )

    一、多态实现 1、面向对象中 " 多态 " 的真正需求 在上一篇博客 【C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 ) 中 , 进行了测试 , 在测试代码中..., 这并不是我们想要的 ; 上述测试中 , 根据实际的 对象类型 确定 重写函数 中要调用 父类 还是 子类 中的函数 , 并不是我们期望的 ; 多态 的 需求是 : 相同的调用语句 , 有多种不通的表现形态...指针 指向 父类 , 就调用父类的函数 ; 指针 指向 子类 , 就调用 子类的函数 ; 2、面向对象 " 多态 " 实现 - virtual 修饰函数 C++ 语言中 , 通过使用 virtual...关键字 修饰 函数 , 子类中重写该函数时 , 可以不使用 virtual 关键字 ; 在开发时 , 建议 父类 和 子类 的 重载函数 都使用 virtual 关键字修饰 , 表示多态 , 这样能在开发者阅读代码时..., 更容易理解 此处要开始使用 多态机制了 ; 二、代码示例 - 多态实现 1、代码示例 在下面的代码中 , 使用 virtual 关键字 修饰 父类 和 子类 中的函数 , 最终实现了 多态 ; 代码示例

    14520

    【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

    1、类 1.1、类的定义 在 C++ 中,类 是面向对象编程的核心概念之一。它是一种用户定义的数据类型,用于描述一组具有相同特性(属性)和行为(方法)的对象。...在C++中,对象的大小是一个与内存管理息息相关的重要概念。...C++中数据和函数都封装到了类里面,通过访问限定符进行了、限制,不能再随意通过对象直接访问数据,这是C++封装的⼀种体现,这个是最重要的变化。...4、C 与 C++ 实现 stack:C++ 靠类封装,清晰安全;C 语言用结构体与函数指针,灵活但手动管理内存且耦合度高。 在 C++ 中,类与对象是根基。...它们奠定了 C++ 世界的基石,是开启编程进阶之路的必经之门,本文主要讲解最基本的类和对象的定义,在进阶部分会对类和对象进行更深层次的剖析,为后续C++飞升之路打造最有力的制胜法宝!

    41310

    解决C++代码单元测试中的难题-不可验证和IO调用

    在做C++程序的单元测试时,大家经常会遇到两个问题: 1.不方便验证测试结果,原因是因为不可访问保护和私有类成员 2.对于需要访问的connect、receive、send等不好绕过 这里介绍两种方法,...即可解决: 1.在编译单元测试代码时,加上UNIT_TEST宏(名字可以为其它你喜欢的),并将private定义成public,即: #define private public 这样就可以测试代码就可以随意访问类的任何成员了...,单元测试就是要做白盒测试,将内部看得清清楚楚 以前喜欢使用友元类的方式,但那需要在代码中安插测试代码,所以这个办法更好。...2.对于IO问题,只需要从被测试再继承一下,然后重实现(如果为虚拟,则为隐藏)相应的方法,改成方便验证的,这样问题也就好解决了。设计模式中的Decorator模式用在这里非常合适。

    50110

    解决C++代码单元测试中的难题-不可验证和IO调用

    原帖发表在Hadoop技术论坛 在做C++程序的单元测试时,大家经常会遇到两个问题: 1.不方便验证测试结果,原因是因为不可访问保护和私有类成员 2.对于需要访问的connect、receive、send...等不好绕过 这里介绍两种方法,即可解决: 1.在编译单元测试代码时,加上UNIT_TEST宏(名字可以为其它你喜欢的),并将private定义成public,即: #define private public...这样就可以测试代码就可以随意访问类的任何成员了,单元测试就是要做白盒测试,将内部看得清清楚楚 以前喜欢使用友元类的方式,但那需要在代码中安插测试代码,所以这个办法更好。...2.对于IO问题,只需要从被测试再继承一下,然后重实现(如果为虚拟,则为隐藏)相应的方法,改成方便验证的,这样问题也就好解决了。设计模式中的Decorator模式用在这里非常合适。

    51210

    【C++】类和对象(中):类的默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

    共3点: 1.如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义,编译器就不再生成。...析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束,栈帧销毁,他就释放了不需要我们管。C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。...这里解释一下为什么拷贝构造第一个参数传参方式必须是引用。 首先我们要知道,C++规定传值传参要调用拷贝构造,没有为什么,就是规定。比如说下面这个f1函数。...在C语言中实参传给形参就是直接拷贝过去,不会调用一个函数,在C++中传值传参要调用拷贝函数。 我们在直接调用拷贝构造函数时,因为是引用传参,就不会形成新的拷贝函数。...不需要了吧,编译器会自动生成。这也就是为什么我在这一小节的开头并没有自己写拷贝构造函数的代码但依然可以进行拷贝构造。

    11910

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的...地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent;

    30920

    深入解析【C++多态】:探索面向对象编程中的动态绑定与行为多样性和多态的核心概念与应用实践

    上⾯题⽬运⾏结果12bytes,除了_b和_ch成员,还多⼀个__vfptr放在对象的前⾯(注意有些平台可能 会放到对象的最后⾯,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual...(这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000 标记,g++系列编译不会放) 虚函数存在哪的?...虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的,只是虚函 数的地址⼜存到了虚表中。 虚函数表存在哪的?...这个问题严格说并没有标准答案C++标准并没有规定,我们写下⾯的代码可以 对⽐验证⼀下。...(这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000 标记,g++系列编译不会放) i是int存放在栈上。

    11500

    在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

    在.NET与C++之间传输集合数据 上一篇《在C++中反射调用.NET(二)》中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...C++中的列表对象list 下面看看完整的C++/CLI反射调用的代码: std::list GetUsers(String^ likeName)...C++/CLI的数组类型 array^ ,而不是C++标准库的数组,因此不要引用下面的命名空间: using namespace std; 否则VS会提示数组定义缺少参数。...与.NET直接调用和反射的性能比较 在本篇的方案中,都是C++反射来调用.NET方法的,如果都是在.NET应用程序中直接调用或者反射.NET方法,性能差距有多少呢?...C++代码与.NET代码通信的效率。

    9.1K100

    【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )

    函数声明 和 实现 写在相同的 .cpp 源码文件中 ; 类模板 的 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中 ; 在博客 【C++】泛型编程 ⑨ (...; 在博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 ) 中 , 分析了 第二种情况 , 类模板 的...函数实现 在 类外部进行 , 写在 一个 cpp 源码文件中 ; 在本篇博客中 , 开始分析 第三种 情况 , 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中...; 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 1、分离代码 后的 友元函数报错信息 - 错误示例 上一篇博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载...、代码示例 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 1、完整代码示例 Student.h 头文件内容 Student.h 头文件内容 : #include "iostream

    25410

    实现多态必须满足什么条件

    functions called must be virtual and objects must be manipulated through pointers or references Q: 为什么使用派生类和基类对象之间直接赋值不能实现...为什么要用虚函数 A: 为什么使用派生类和基类对象之间直接赋值不能实现?? 必须用用指针或者引用?...要实现多态,必须使用指针或者引用 因为默认的赋值运算符并不会操作虚函数表 验证如下:[ Print C++ vtables using GDB] 1.1 vptr 理解成指针 因为不知道vptr...函数入口地址 图片可能和代码不符 你应该可以看懂 没有虚函数的对象数据布局 成员类型相同: ?...有虚函数的对象数据布局 跟深入地方请查看《Inside the C++ Object Model》 我理解 数据部分: 对象在执行赋值 ==操作时候,如果类型不同会发生强制转换 因此需要相同成员

    77870

    PS编程基础入门2

    [TOC] PS 数组和哈希表 描述:数组引入PS会将命令执行后的结果文本按每一行作为元素存为数组,在命令的返回值不止一个结果时,PS也会自动把结果存储为数组。...PS数组在内存中是顺序存储的,所以数组的大小必须是确定的方便分配存储空间 数组属于引用类型,使用默认的的赋值运算符在两个变量之间赋值只是复制了一个引用两个变量共享同一份数据,则改变一个另一个也会相应的改变...返回的结果称为对象?...#HASH表的键值对数量 2 PS > $hash[email protected]{ Name="WeiyiGeek";Age="15"; Books="C","C++","PYTHON"} #在哈希表中存储数组...文件大小25.765625KB: 文件名:alias 文件大小11.77734375KB: PS 函数 描述:函数就是将大大小小的命令组合成一个集合里面进行执行,有利于提高代码复用以及简练代码量;

    1.3K30
    领券