据我所知,每个创建的对象都有自己的地址,每个对象的方法也有自己的地址。我想用以下想法来验证这一点:
步骤1:构建具有公共方法的类A,其名称为“method”。
步骤2:在A类中创建两个对象,它们是对象“b”和对象“c”。
步骤3:使用函数指针访问“b.method”和“c.method”的地址,检查它们是否相等。
但我在步骤3中遇到了问题,并找到了各种方法来解决但失败了。所以我在这里发帖请教大家如何验证我上面所说的。感谢大家!这是我的 C++ 代码:
#include<iostream>
using namespace std;
class A
{
public:
int a;
void method()
{
//do something
}
static void (*fptr)();
};
int main()
{
A b, c;
A::fptr= &(b.method); //error: cannot convert 'A::method' from type
// 'void(A::)()' to type 'void (*)()'
cout << A::fptr << endl;
A::fptr= &(c.method); //error: cannot convert 'A::method' from type
//'void(A::)()' to type 'void (*)()'
cout << A::fptr << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为什么我不能有一个std::set或std::unordered_set的std::functionS'
有什么方法可以让它工作吗?
考虑这个功能模板:
template<typename T>
unsigned long f(void *) { return 0;}
Run Code Online (Sandbox Code Playgroud)
现在,我打印的地址f<A>和f<B>为:
std::cout << (void*)f<A> << std::endl;
std::cout << (void*)f<B> << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果在MSVS10中编译,为什么它们会打印相同的地址?它们不是两个不同的功能,因此应该打印不同的地址吗?
更新:
我意识到在ideone上,它会打印出不同的地址.MSVS10优化代码,因为函数不依赖T于任何方式,因此它产生相同的功能.@Mark的回答和对此的评论很有价值.:-)
模板和内联函数应在标头中提供,因此相同的代码将进入使用它们的每个翻译单元。
除非编译器选择实际将模板或内联代码放入内联,否则链接器最好删除每个翻译单元中出现的相同代码。这真的会发生吗?标准要求?还是由编译器决定?
我需要帮助从反汇编逆向工程虚拟方法.该代码最初使用Microsoft的Visual C++编译.有问题的方法如下:
sub_92D110 proc near
xor al, al
retn
sub_92d110 endp
Run Code Online (Sandbox Code Playgroud)
这个方法在很多类之间引用,甚至在一个类的vtable内多次引用.我不确定它的作用; 这是否意味着该方法被内联,但调用仍然保持vtable保持其大小?
如果是这样,那该怎么xor al, al办?我是否误解了召唤大会或其他什么?