首页
学习
活动
专区
工具
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这些暂时先在这里不介绍,就先知道coutc语言里面的printf函数一样,用来打印输出就行了,这几天之内介绍...2、其实一般来说对象访问类里面的属性都要有一个初始化,在c++里面有一一个构造函数,就可以解决对象访问类属性初值问题,就不用管第一条说那样(分栈、堆啥),那我们怎样使用构造函数呢?...首先我们要明白构造函数定义: C++可以定义与类名相同特殊成员函数,这个特殊成员函就是构造函数了。 构造函数没有任何返回类型声明。 构造函数在对象定义时自动被调用。

41420

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

56020

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

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

1.6K10

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

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

11920

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、代码示例 - 继承构造函数析构函数

18040

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

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

47710

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

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

48710

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

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

20320

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代码通信效率。

9K100

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

15310

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

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》 我理解 数据部分: 对象在执行赋值 ==操作时候,如果类型不同会发生强制转换 因此需要相同成员

74470

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.2K30

文件大小为什么占用空间不一样?

此外,还存在这样情况,同一个文件,存放在不同磁盘分区、不同操作系统环境,所占用空间也不一样!这又是为什么呢?...①文件大小与所占空间差别  文件大小其实就是文件内容实际具有的字节数,它以Byte为衡量单位,只要文件内容格式不发生变化文件大小就不会发生变化。...为了更好地管理磁盘空间更高效地从硬盘读取数据,操作系统规定一个簇只能放置一个文件内容,因此文件所占用空间,只能是簇整数倍;而如果文件实际大小小于一簇,它也要占一簇空间。...②分区格式与簇大小  计算文件所占空间时,可以用如下公式: 簇数=取整(文件大小/簇大小)+1  所占空间=簇数×磁盘簇大小  公式中文件大小簇大小应以Byte为单位,否则可能产生误差。...例如我们要在Windows XP下查看C簇大小,可以单击“开始→运行”,键入“CMD”后回车,再键入“C:”后回车,然后输入“Chkdsk”后回车,稍候片刻从它分析结果,我们就可以得到C簇大小

4.5K10

Java基础八股文第一弹

Java 与 C++ 区别 Java 是纯粹面向对象语言,所有的对象都继承自 java.lang.Object,C++ 兼容 C ,不但支持面向对象也支持面向过程。...Java 通过虚拟机从而实现跨平台特性, C++ 依赖于特定平台。 Java 没有指针,它引用可以理解为安全指针,而 C++ 具有 C 一样指针。...Java 支持自动垃圾回收,而 C++ 需要手动回收。 Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。 面向对象和面向过程区别?...黑白双方负责接受用户输入,并告知棋盘系统棋子布局发生变化,棋盘系统接收到了棋子变化信息就负责在屏幕上面显示出这种变化,同时利用规则系统来对棋局进行判定。 JKDJRE区别?...静态多态性:通过重载实现,相同方法有不同參数列表,可以根据参数不同,做出不同处理。 动态多态性:在子类重写父类方法。运行期间判断所引用对象实际类型,根据其实际类型调用相应方法。

91110

27 个问题,告诉你Python为什么这么设计

C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们很可惜。使用显式 self.var 很好地解决了这个问题。...Nuitka 是一个将Python编译成 C++ 代码新兴编译器,旨在支持完整Python语言。要编译成Java,可以考虑 VOC 。 Python如何管理内存?...为什么字典key必须是不可变? 字典哈希表实现使用从键值计算哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希值不同。...如何在Python中指定实施接口规范? 由C++Java等语言提供模块接口规范描述了模块方法函数原型。许多人认为接口规范编译时强制执行有助于构建大型程序。

6.6K11

C++之文件

C++ 文件处理 官方文档:http://www.cplusplus.com/reference/cstdio/fopen/ 相关内容简介: fopen方法介绍 文本文件读取 写入文本文件 二进制文件读写...读取文件大小 文本文件加解密 二进制文件加解密 fopen fopen( ) 函数来创建一个新文件或者打开一个已有的文件,这个调用初始化类型 FILE 一个对象,类型 FILE 包含了所有用来控制流必要信息...; return 0; } char *text = "C++开发,我看好你"; fputs(text, fp); fclose(fp);...( const void * ptr, size_t size, size_t count, FILE * stream ); 把 ptr 所指向数组数据写入到给定流 stream 栗子代码...); biDecode(encode_path, decode_path, "ILoveYou"); system("pause"); return 0; } 结语 以上就是C+

80330

27 个问题,告诉你Python为什么这么设计?

C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们很可惜。使用显式 self.var 很好地解决了这个问题。...Nuitka 是一个将Python编译成 C++ 代码新兴编译器,旨在支持完整Python语言。要编译成Java,可以考虑 VOC 。 Python如何管理内存?...为什么字典key必须是不可变? 字典哈希表实现使用从键值计算哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希值不同。...如何在Python中指定实施接口规范? 由C++Java等语言提供模块接口规范描述了模块方法函数原型。许多人认为接口规范编译时强制执行有助于构建大型程序。

3.1K20

Python官方二十七问,你知道个啥?

C ,括号可以放到许多不同位置。如果您习惯于阅读编写使用一种风格代码,那么在阅读(或被要求编写)另一种风格时,您至少感到有些不安。 许多编码风格将开始/结束括号单独放在一行上。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们很可惜。使用显式 self.var 很好地解决了这个问题。...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希值不同。...如何在 Python 中指定实施接口规范? 由 C++ Java 等语言提供模块接口规范描述了模块方法函数原型。许多人认为接口规范编译时强制执行有助于构建大型程序。

2.5K20

干货 | 27 个问题,告诉你 Python 为什么如此设计?

C ,括号可以放到许多不同位置。如果您习惯于阅读编写使用一种风格代码,那么在阅读(或被要求编写)另一种风格时,您至少感到有些不安。 许多编码风格将开始/结束括号单独放在一行上。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们很可惜。使用显式 self.var 很好地解决了这个问题。...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希值不同。...如何在 Python 中指定实施接口规范? 由 C++ Java 等语言提供模块接口规范描述了模块方法函数原型。许多人认为接口规范编译时强制执行有助于构建大型程序。

2.6K20

干货 | 27 个问题,告诉你 Python 为什么如此设计?

C ,括号可以放到许多不同位置。如果您习惯于阅读编写使用一种风格代码,那么在阅读(或被要求编写)另一种风格时,您至少感到有些不安。 许多编码风格将开始/结束括号单独放在一行上。...C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们很可惜。使用显式 self.var 很好地解决了这个问题。...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希值不同。...如何在 Python 中指定实施接口规范? 由 C++ Java 等语言提供模块接口规范描述了模块方法函数原型。许多人认为接口规范编译时强制执行有助于构建大型程序。

2.7K10
领券