c++如何分配类方法

Posted

技术标签:

【中文标题】c++如何分配类方法【英文标题】:How does c++ allocate class methods 【发布时间】:2013-06-28 11:12:46 【问题描述】:

基本上,我在互联网上找不到太多关于此的信息,但我知道基本的类实例化是: -> operator new() -> 从某处分配内存 -> 构造函数 -> 为“数据类型”赋值

现在,我想知道的是,C++ 如何分配类的方法/函数而不是其成员。根据我的网络研究,这不会在 new() 中发生,因为它只是分配原始内存,而且据我所知,我还没有完全弄清楚如何在带有函数的构造函数中做到这一点(而是比函数指针)。另外,我假设由于关键字static的存在,没有这个关键字,它被分配为父类的一部分。这是如何以及在哪里发生的?

另外,如果函数包含在类的内存中,函数 sizeof() 是只给出类及其成员的大小,还是还包含相关函数?

【问题讨论】:

虚函数放在一个[v-table][1] [1]中:***.com/questions/1963926/… 您认为创建对象时应该如何处理函数?函数的代码已经存在,在你的二进制文件中,这就是编译器的用途。 操作系统应用程序加载器(也可能是虚拟分页内存管理器)会执行此操作。不太明白你的问题? 如果您没有操作系统应用程序加载器或分页内存管理器怎么办 - 换句话说,如果您正在构建内核等。 正如@PlasmaHH 指出的,这是编译器和链接器的工作。这同样适用于没有 OS loader 运行的固件。 【参考方案1】:

编译代码时,编译器会将函数的起始地址存储在原始代码中。该地址可以是相对程序的起始位置,也可以是绝对内存地址。

关键是在代码中调用函数时(假设已解决范围问题),而编译编译器只需将跳转语句插入到函数代码所在的地址。为了返回相同的位置,还有一些其他的操作正在发生。

因此,当您说分配了空间时,它只是函数的字节码占用的空间加上 table inn 编译器中显示 this function is present at this address 的条目

几乎所有编程语言(编译)都是如此,不仅C++

至于您的另一部分:sizeof(type) 返回类型的对象表示的字节大小,该类型基本上是其成员大小的聚合(如果我们省略了编译器为优化而完成的填充)。

【讨论】:

如果我想将函数移动到特定位置,从它所在的位置,我将如何获取它的位置和大小?另外,我可以更改函数引用,还是必须使用函数指针来完成 @DavidTurner move the function 是什么意思?? 你不能移动函数。它们位于只读内存中 您可以将函数复制到动态分配的空间,并使用函数指针调用它,但大多数平台会考虑这种“执行数据”并抛出错误。 你没有......显然你正在尝试进行一个对你目前的理解水平来说过于雄心勃勃的项目。

以上是关于c++如何分配类方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,动态分配单个类的最佳方法是啥? [关闭]

xcode c++错误:分配抽象类类型'Grain'的对象

C++ 通过分配其他构造函数初始化的类成员来初始化类成员是一个坏主意吗?

有啥方法可以防止类的动态分配?

返回在堆上分配的类的实例(C++)[关闭]

C++ - 创建类对象向量时使用删除的正确方法