C ++对象实例成员函数内存表示

时间:2015-05-29 10:34:44

标签: c++ memory

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的指针,只是它调用函数,同时将实例指针作为额外的参数传递?

2 个答案:

答案 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。