- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我编写了以下 C++ 程序
class MyClass {
public:
int i;
int j;
MyClass() {};
};
int main(void)
{
MyClass inst;
inst.i = 1;
inst.j = 2;
}
我编译了。
# g++ program.cpp
# ls -l a.out
-rwxr-xr-x 1 root wheel 4837 Aug 7 20:50 a.out
然后,我在源文件中#include
d头文件iostream,我再次编译。
# g++ program.cpp
# ls -l a.out
-rwxr-xr-x 1 root wheel 6505 Aug 7 20:54 a.out
正如预期的那样,文件大小增加了。
我还写了下面的C程序
int main(void)
{
int i = 1;
int j = 2;
}
我编译了
# gcc program.c
# ls -l a.out
-rwxr-xr-x 1 root wheel 4570 Aug 7 21:01 a.out
然后,我#include
d头文件stdio.h,我再次编译
# gcc program.c
# ls -l a.out
-rwxr-xr-x 1 root wheel 4570 Aug 7 21:04 a.out
奇怪的是,可执行文件的大小保持不变。
最佳答案
通过在源文件中包含 iostream
,编译器需要生成代码来设置和拆除 C++ 标准 I/O 库。您可以通过查看 nm
的输出来看到这一点,它显示了目标文件中的符号(通常是函数):
$ nm --demangle test_with_iostream
08049914 d _DYNAMIC
08049a00 d _GLOBAL_OFFSET_TABLE_
08048718 t global constructors keyed to main
0804883c R _IO_stdin_used
w _Jv_RegisterClasses
080486d8 t __static_initialization_and_destruction_0(int, int)
08048748 W MyClass::MyClass()
U std::string::size() const@@GLIBCXX_3.4
U std::string::operator[](unsigned int) const@@GLIBCXX_3.4
U std::ios_base::Init::Init()@@GLIBCXX_3.4
U std::ios_base::Init::~Init()@@GLIBCXX_3.4
080485cc t std::__verify_grouping(char const*, unsigned int, std::string const&)
0804874e W unsigned int const& std::min<unsigned int>(unsigned int const&, unsigned int const&)
08049a3c b std::__ioinit
08049904 d __CTOR_END__
... (remaining output snipped) ...
(--demangle
采用编译器“修改”过的 C++ 函数名称并生成更有意义的名称。如果函数包含在可执行文件中,则第一列是地址。第二列column 是类型。“t”是“text”段中的代码。“U”是从其他地方链接的符号;在这种情况下,来自 C++ 共享库。)
将此与从源文件生成的函数进行比较,不包括 iostream
:
$ nm --demangle test_without_iostream
08049508 d _DYNAMIC
080495f4 d _GLOBAL_OFFSET_TABLE_
080484ec R _IO_stdin_used
w _Jv_RegisterClasses
0804841c W MyClass::MyClass()
080494f8 d __CTOR_END__
... (remaining output snipped) ...
当您的源文件包含 iostream
时,编译器会生成几个没有 iostream
时不存在的函数。
当您的源文件仅包含 stdio.h
时,生成的二进制文件类似于没有 iostream
的测试,因为 C 标准 I/O 库不需要超出 C 动态库中已经发生的任何额外初始化。您可以通过查看 nm
输出来看到这一点,它是相同的。
不过,一般来说,试图根据可执行文件的大小来直观地了解特定源文件生成的代码量是没有意义的。有太多东西可以改变,如果编译器包含调试信息,源文件的位置等简单的事情可能会改变二进制文件。
您还可能会发现 objdump
对于查看可执行文件的内容很有用。
关于c++ - 为什么 C 头文件不增加二进制文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1246260/
我有一位客户希望她的网站适合 iPad/iPhone。该网站有一个用 Flash 制作的菜单标题。我使用 Google 的 Swiffy 将文件转换为 flash_1.html 文件。 当网站检测到
我注意到 boost 库使用了 (.hpp) 的头文件。 我很好奇,因为我看到的大多数源文件都使用普通的 .h 头文件。 是否有任何特殊情况需要使用 .hpp 而不是 .h ? 谢谢 最佳答案 只是约
C需要不同的头文件,如stdio.h、stdlib.h、fcntl.h等,对于不同的函数和结构定义,这是为什么?在幕后,一切都归结为 libc 那么为什么不创建一个包含所有定义和原型(prototyp
我是一名工科学生,不是一个非常强大的程序员。我的一项作业包括使用 openGL 创建 VR 程序。我得到了一个使用 gmtl 的模板(我真的不想重写)标题广泛。该作业需要实现一些 sixense模拟中
我正在尝试编译涉及C和C++文件的应用程序。使用一个特定的 header ,我遇到了问题。有问题的文件(C++头文件)如下所示: #ifndef TASK_H #define TASK_H #incl
我编写了我的项目,将main和c源代码保存在一个文件中,并将头文件保存在codeblocks的include目录中。当我从项目主函数中调用我的函数时,它编译得很好......但是当我将 header
我正在尝试将 .so 库导入到 python 代码中以使用 c 函数。我认为使用 from ctypes import * import ctypes lib = CDLL('./libcaenhvw
我有 2 个重叠的头文件,如下所示: header1.h ... __declspec(dllexport) void abc(); __declspec(dllexport) void xyz(
我有一个大型 Java 库,我想开发几个与该库接口(interface)的较小应用程序。该库将作为 JAR 出现在目标设备的类路径中,但我想尽可能避免在编译时出现整个库(JAR 或源代码)。 (如果重
我必须在我的项目中使用相机制造商提供的库。我正在使用 Visual Studio 2015。我在编写#include 后合并了VS 2015 建议的所有头文件。 我已经在VS 2015中指定了包含文件
我在编写我的项目时遇到了这个问题。我有 2 个 header ,每个 header 都有一个类,它们需要另一个,如下所示。 我以为这只是需要使用前向声明,但仍然不起作用。我没有想法。 寻求帮助:D H
我在一个项目中工作,我想在C++中做反射,所以经过研究我发现最好的方法是解析头文件以获得XML格式的抽象语法树并在反射中使用它。我尝试了很多工具,但没有一个与 visual c++ 2008 或 vi
我尝试从 BufferedImage 制作一个 BMP 文件。这是我尝试在 bmp 文件中写入标题和像素的函数。 我有一个错误,但我找不到那个。我需要你的帮助。 static void writeTo
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: undefined reference to `WinMain@16' 我一直在研究循环双链表。决定创建一个
处理这种情况的最佳做法是什么? class A { private: std::vector derp; public: struct B { ...
上下文:我正在为嵌入式板构建一些代码。它需要安装 Xilinx 工具、Linaro 工具链,然后调用开发板构建目录中的设置 bash 脚本(我们称之为 setup.sh)。 如果我不运行 setup.
我尝试使用头文件和源文件,但遇到了问题。因此,我对我正在尝试做的事情做了一个简化版本,我在 CodeBlocks 中遇到了同样的错误(undefined reference to add(double
当我包含用于将某些程序的整数类型转换为字符串类型的#include 头文件时,我的编译器(GCC for C++)抛出错误。谁能帮我解决这个问题? 这是一个C++的小代码,我是第一次尝试。 #incl
我的头文件中有一些错误,我不知道如何修复,因为我是 C++ 的新手。 这是头文件的代码: #pragma once typedef unsigned int uint; class DCEncrypt
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!