c++ - Typedefs、(二进制)代码复制和目标文件

标签 c++ class compiler-construction typedef object-files

假设我编译了一个包含这段代码的源文件,

struct Point
{
    int x;
    int y;
};

struct Size
{
    int x;
    int y;
};

由于 PointSize 完全相同(就其成员的内存布局而言),编译器是否会生成重复代码(每个 struct) 在目标文件中?这是我的第一个问题。


现在,让我们从源代码中删除struct Size,并使用typedef 来定义它,像这样,

typedef Point Size;

现在编译会做什么?它会重复代码吗(因为 typedef 不只是重命名,而不仅仅是重命名)?


现在假设我们有一个这样的类模板:

template <int UnUsed>
class ConcreteError : public BaseError {
public:
    ConcreteError () :BaseError(), error_msg() {}

    ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
        :BaseError(errorCode, osErrorCode, errorMessage){}
};

然后我们设置一些定义,像这样,

typedef ConcreteError<0> FileError;
typedef ConcreteError<1> NetworkError;
typedef ConcreteError<2> DatabaseError;

由于模板参数int UnUsed在类的实现中没有使用(只是假设),所以看起来这种情况与多个具有完全相同内存布局的类完全相同(类似于struct Pointstruct Size 的情况下,目标文件中是否存在重复代码?

如果我们这样做呢

typedef ConcreteError<0> FileError;
typedef ConcreteError<0> NetworkError;
typedef ConcreteError<0> DatabaseError;

这种情况是否更好,因为现在我们在 typedef 中使用相同实例化类?

PS:此类模板代码取自这里:

How to create derived classes from a base class using template programming in C++?


实际上,我不知道编译器如何从源代码生成目标文件,以及它如何处理类名、它的成员、其他符号等等。它如何处理 typedef?它有什么作用,

typedef int ArrayInt[100];

ArrayInt类型吗?什么代码编译器在目标文件中为它创建? 100 存储在哪里?

最佳答案

您的示例中的任何一行都不会在目标文件中生成任何代码。或者,更准确地说,它根本不会生成任何数据。我认为“代码”仅意味着处理器指令。

目标文件中的数据分为三段:代码、静态数据和常量数据。

除内联函数外,代码由实际函数定义(带有函数体,而不仅仅是声明)生成。内联函数在每次实际使用时都会生成代码。模板函数在实例化时生成代码,但多个实例化通常由编译器、链接器或两者优化为单个实例。

静态数据是通过定义全局变量、静态成员变量(同样是实际定义而不仅仅是类内的声明)和静态局部变量生成的。不得使用 const 修饰符声明变量以转到静态数据段。

常量数据由与静态数据相同类型的变量声明生成,但带有 const 修饰符,加上浮点文字、字符串文字以及可能更多的文字,具体取决于硬件平台。操作系统实际上可能不允许在硬件级别上对常量数据进行写入访问,因此如果您尝试在其中写入内容,您的程序可能会因访问冲突或段错误而崩溃。

我不是这类低级事物的真正专家,所以我可能漏掉了一些东西,但我认为我很好地描述了整体情况。

除非我真的遗漏了什么,否则程序中的任何其他内容都不会在目标文件中生成任何数据,尤其是声明和类型定义。这些由编译器在内部使用。因此,当编译器看到结构定义时,它会记住它由两个 32 位整数组成。当它找到一些使用该结构的真实代码时,它知道它必须生成使用两个 32 位整数的代码,必须分配至少 8 个字节来存储它等等。但是所有这些信息都在编译时内部使用,并没有真正进入目标文件。如果 C++ 有反射之类的东西,那就是另一回事了。

请注意,虽然定义大量结构不会向目标文件添加任何内容,但它可能会增加编译器本身的内存使用量。所以你可能会说定义相同的东西会导致编译时的数据重复,但不会在运行时发生。

关于c++ - Typedefs、(二进制)代码复制和目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473205/

相关文章:

c++ - 您使用了哪些策略来缩短大型项目的构建时间?

c++ - 如何在类中定义结构?

javascript - 如何使用 mfc/c++ 在 chrome 或 firefox 中注入(inject)脚本

Python 类和方法实例化

python - 长双链表

C编程: Drag&Drop a file over a program's icon

php - 如何构建在线 Objective-C 编译器

c++ - C++ 17 有静态反射吗?

c++ - Win32 应用程序中的绘图问题

java - Android - 多个 Activity 使用一个类