请教成员函数和线程安全的问题
在C++对象的内存布局里面,成员函数并没有放在对象的内存中,而是放在对象之外的某个地方。并且貌似函数的地址是针对类而不是针对对象的,比如:
- C/C++ code
class C{public: int foo();};那么:
- C/C++ code
printf("Address:%p", &C:foo);可以打印出这个函数的地址。
我想不通的是,既然函数的地址对类的对象是统一的,那么不同的对象同时调用这个函数的时候,就会从相同的入口地址开始执行,那不会有问题吗?
[解决办法]
不同的对象在调用函数时,this指针值隐式传人成员函数,即不同的对象调用这个函数的时候,这个函数操作不同的对象,此时显然不存在共享资源竞争的问题。
[解决办法]
1楼说了,,,
函数不是属于对象的,是属于类的, 这个表达不严谨,大概是这个意思
通过this指针, this表示对象的地址,
int foo(对象地址); 会插入一个对象地址, 然后这个对象地址->foo函数。。。
去查找到函数。。。
线程是另外一回事。。。
比如:一个类中加一个线程函数, 必须用static消除this指针。。。。。。
这是windows编程遇到的个问题。。。。
static修饰一个函数,表示着函数,可以不需要用this就,可以找到它,然后调用它。
[解决办法]
不会有问题的.
C:foo的首地址在同一进程中是固定的(一般是基址+偏移), 而多线程同时对同一内存进行读取和执行是不会有问题, 除非传入的this一样而又对this及其相关内存进行写操作
[解决办法]
class Sample
{
int val;
std::string name;
public:
Sample(int data, std::string str):val(data),name(str){}
std::string GetName() const
{
return name;
}
};
int main()
{
Sample obj(23,"csdn");
std::string strName=obj.GetName();
001A398C lea eax,[ebp-60h] ;取对象地址,即:this 指针
001A398F push eax //this压入栈中
001A3990 lea ecx,[ebp-38h] ;strName的地址
001A3993 call Sample::GetName (1A11F4h)
return 0;
}
[解决办法]
不同对象用不同的地址调用
[解决办法]
[解决办法]
代码段就是可以被任意调用的,它一般作为只读,你的数据段和堆栈段不同即可。。