返回信息流```C
#include<thread>
#include<iostream>
using namespace std;
void f(){
for(int i=0;i<10;i++){
cout<<i;
}
}
int main(){
thread t1(&f);
thread t2(&f);
t1.join();
t2.join();
return 1;
}
```
以下是输出"00112233445566778899"
问题:一个函数的局部变量表存在于线程的栈帧当中,对于上面的f来说,两个线程同时执行f函数,不会有什么并发问题。我的疑问是这个函数指针,指向的物理地址,里面存储的是些什么东西?应该是没有局部变量表这些线程私有的东西吧?
表达能力捉急,不知道有没有说清楚,求大神解惑
这是一条镜像帖。来源:北邮人论坛 / cpp / #94423同步于 2017/1/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于函数指针的一些疑惑
liuyehcf
2017/1/29镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
非常感谢~
【 在 zhengy222 的大作中提到: 】
: 函数指针指向的是这个函数代码段所在的地址,局部变量的内容在运行时存放在栈里。所以函数指针指向的是这个函数编译后的二进制指令的起始地址。
非常感谢~不会汇编,看来是时候学一学了
【 在 Vampire 的大作中提到: 】
: 试试 g++ -std=c++11 -S xxx.c 生成汇编代码,看看传给 thread 构造函数的参数那个地址有些啥
The pointer may point to the first instruction executed by the pointed function.
Each thread has its own stack for data. Even if the instructions are shared between threads, different thread accesss different set of data.
C语言并没有规定指针是用什么表示的。所以,你只要知道“指向一个函数的指针就是可以指代那个函数的东西”就可以了。
一般来说,C语言的函数编译成一段机器码,而函数的指针就是那段机器码的首地址。局部变量保存在栈上或者寄存器里,C程序里所有对局部变量的访问都被翻译成对寄存器或者栈的访问了,所以没有所谓的“局部变量表”。调用函数的时候,调用者和被调用者达成一项协议(即:calling convention),包括参数放在哪些寄存器里或者栈上的哪些位置、返回值写到哪个寄存器里或者栈上哪个位置、返回地址在哪个寄存器里(比如arm的lr寄存器)或者栈上哪个位置(比如x86_64的rsp指向的地方)。这些是平台的application binary interface(ABI)规定的。当然,我说的只是C语言的一种实现方法,一般来说是这样实现的。你可以写一个C语言的解释器,一切就都不一样了。
谢暖神大大~
【 在 nuanyangyang 的大作中提到: 】
: C语言并没有规定指针是用什么表示的。所以,你只要知道“指向一个函数的指针就是可以指代那个函数的东西”就可以了。
: 一般来说,C语言的函数编译成一段机器码,而函数的指针就是那段机器码的首地址。局部变量保存在栈上或者寄存器里,C程序里所有对局部变量的访问都被翻译成对寄存器或者栈的访问了,所以没有所谓的“局部变量表”。调用函数的时候,调用者和被调用者达成一项协议(即:calling convention),包括参数放在哪些寄存器里或者栈上的哪些位置、返回值写到哪个寄存器里或者栈上哪个位置、返回地址在哪个寄存器里(比如arm的lr寄存器)或者栈上哪个位置(比如x86_64的rsp指向的地方)。这些是平台的application binary interface(ABI)规定的。当然,我说的只是C语言的一种实现方法,一般来说是这样实现的。你可以写一个C语言的解释器,一切就都不一样了。