C ++中的成员函数究竟是如何在内存中表示的?据我所知,基本上有三种类型的功能:
-Static:这些表示为任何其他全局函数
-Virtual:可以在运行时通过vtable访问这些,以便执行动态调度。
- 非静态和非虚拟:我在这里遇到麻烦。大多数文章或解释说,它们的表示方式与代码中的普通函数相同,唯一的区别是它们希望隐藏的“this”指针作为参数,以便能够访问实例的数据。但是,我不太确定这是如何表示/实施的。例如,如果我有:
string xml = @"<channel>
<title>test + test</title>
<link>http://testprog.test.net/api/test</link>
<description>test.com</description>
<category>test + test</category>
<item xml:base=""http://test.com/test.html?id=25"">
<guid isPermaLink=""false"">25</guid>
<link>http://test.com/link.html</link>
<title>title test</title>
<description>Description test description test</description>
<a10>2015-05-26T10:23:53Z</a10>
<enclosure type="""" url=""http://anupshah.com/test/test.jpg"" width=""200"" height=""200""/>
</item>
</channel>";
var str = XElement.Parse(xml);
var result = (from myConfig in str.Elements("item")
select myConfig.Elements("enclosure").Attributes("url").SingleOrDefault())
.First();
Console.WriteLine(result.ToString());
现在如果我打电话
class A:
int var_a;
public:
int get_member_var_a(){
return var_a;
}
A(int init): var_a(init) {}
A* instance_of_a = new A(4);
objet int tmp = instance_of_a->get_member_var_a();
的实例是否有一个指向存储在内存中的函数A
的指针,只是它调用函数,同时将实例指针作为额外的参数传递?
答案 0 :(得分:2)
对于大多数实现,您的第二个假设可能都是正确的。
int A::get_member_var_a()
很可能会被编译成类似的东西
int __internal_compiler_prefix___A___get_member_var___thiscall(A* this)
所有a->fun()
将由fun(a)
编译器“替换”。
将地址存储到实例中的函数是一个太大的开销(每个对象每个方法几个字节),因此甚至可能被标准禁止。
答案 1 :(得分:1)
非静态非虚拟函数将被破坏为&#34; new&#34; C ++编译器的函数。此外,&#34; new&#34;的第一个参数。功能将是&#34;这个&#34;指针。
instance_of_a->get_member_var_a();
编译器会将上面的行转换为:
mangled_function_name_for_get_member_var_a(本)
例如,编译器可能会将函数修改为_ZN1A16get_member_var_aEv。