这样有特定的地址空间,这样可以避免在运行时system对内存调整带来的问题
解决方案 »
- 关于VC对话框静态文本设置背景透明的问题(这个是真的)
- 1万可用分,大家要多少我就散多少(八)
- 怎么实时获取系统的GUP占用率,注意是GPU啊
- Find使用if语句的问题
- VB.net与VC++对应的数据类型!
- ODBC中的select语句问题
- 各位大哥请进来看一下。
- MFC中的几个概念不太明白
- 谁占的内存多,大概多多少
- 如 何 修 改 Win32 EXE 文 件 内 二 进 制 资 源 的 长 度 ?
- 请问只要是线程就有消息队列,还是此线程产生window后才有消息队列?在控制台程序中,在消息循环中,当受到一wm_timer消息时,此消息将发送给那一window procedure?
- (!!大出血求解)怎样实现矩形框(里面有文字)的拖曳和几个矩形框的连线。希望能详尽解答,谢谢!!!(这已是我能给的最高分了)
静态函数与非静态函数实质的区别是this指针的问题。
例如定义这样一个类:
class CAAA
{
public:
.....
static void StaticFunc(int);
void NonstaticFunc(int);
} a;
如果我们调用非静态函数: a.NonstaticFunc(1);
这就相当于调用这样一个c函数: NonstaticFunc(&a, 1);
于是在函数中使用this或存取成员变量时,就使用&a指针实现。
但如果我们调用静态函数: a.StaticFunc(1);
实际相当于调用这样一个c函数: StaticFunc(1);
因此静态函数中没有所谓的this指针。
而非静态函数绝对不行。
也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系
只要愿意,就可以不把它做成全局函数或静态成员函数,而把真正作为对象的一部分,是吗?
Window系统的接口(API)是C标准的,系统在启动线程时,需要直接得到线程的起始位置,因此你也必须向系统直接传递这样一个直接的函数指针,这与C++其它的特性是无关的。
喜欢的话,你也可以直接使用汇编语言来写一个创建线程的过程,这时候,是可以用非静态的类的成员函数的。
对操作系统真正的实现而言,启动一个线程需且只需一个入口地址就可以了。但是你要注意的是,我们提供的所谓控制函数,并不是这个真正的入口点。操作系统启动线程时,总是先调用一些特定的入口代码,这部分代码对线程的运行环境做一定的初始化之后,再调用你的控制函数。由于这些入口代码是在内核中写好了的,所以它所调用得控制函数其原型也是固定的,就是在CreateThread API中声明的那样。因此,在一个封装线程的类里面,实际上控制函数是不是静态的无关紧要,关键的是该类在最终启动线程时,传递给CreateThread函数的控制函数必须符合上述的原型。至于VC的类为什么用静态的控制函数,我想只是为了方便,但这并不说明就不能用非静态函数实现。例如C++Builder中的线程类就没有用到静态控制函数。