f*********i 发帖数: 137 | 1 如果 int M 定义在main()之前做全局变量,就可以用::M
不知道你这种情况除了换个名字还能干什么 |
|
|
D*********s 发帖数: 555 | 3 来自主题: Programming版 - 一个面试题 有,比如libc有bug,
或者前面说的全局变量,访问了不该访问的内存,立刻就死了。 |
|
c***d 发帖数: 996 | 4 ☆─────────────────────────────────────☆
dickkie (大红椒) 于 (Sun Oct 28 23:59:16 2007) 提到:
请问在C++中,内存分配是否严格的按照此规矩:
只有用new生成的对象才在堆上,其余的一律为栈上或全局变量区
小弟有此问题,是因为教科书上说动态内存分配即堆,它的好处是能在runtime时才确
定具体需要多少对象然后生成,而动态内存分配是由new来完成,那么在此例子中:
int i;
cin >> i;
if(i==10) {
int i=3;
string str="foo";
}
请问这里if里的i和str是在栈上还是堆上? |
|
v**j 发帖数: 27 | 5 调用了几个子程序,出现了这样的问题。其中一个子程序本来应该能计算很大的规模,
现在一点点的时候就堆栈溢出了,怎么解决?
尝试着把传递的矩阵换成全局变量,但是因为它的规模需要调整,子程序里好像不能写
real A(n,n)
common A
n 为传进来的parameter型参数,所以这样也行不通,因为要盖的地方太多。
记得以前有个大牛说过关于子程序中堆栈溢出的问题,现在找不到了,还忘再次指点。
多谢了 |
|
z****e 发帖数: 2024 | 6 有什么书推荐的?
编译和链接,我都是靠编程经验理解的。
尤其是链接,没有系统学过。
编译原理好像也不怎么管用,太理论化了。 |
|
|
w***g 发帖数: 5958 | 8 在.cpp里加上一行 bool DES_Encryption::bDesBusy; 就行了。这是个全局变量,需要
定义。 |
|
m********r 发帖数: 334 | 9 程序有两个线程,一个线程的某个函数什么情况下会修改另一个线程的全局变量?怎么
避免? |
|
a*d 发帖数: 47 | 10 为什末你说 aes_ctx_key对另一个线程是不可见, 前面,你又说是全局变量? |
|
h***i 发帖数: 1970 | 11 aes_ctx_key如果不是全局变量,那就是典型的buffer overflow问题。 |
|
x****u 发帖数: 44466 | 12 我用vc2008的release模式试了一下,编译器没有敢把全局变量换成1... |
|
X****r 发帖数: 3557 | 13 好,我在main里加一句func();汇编出来的结果还是一样的。
我说的是在没有opaque函数调用的情况下编译器有可能优化全局变量,你说不可能,
我举出实际例子来了,你现在在说什么呢。 |
|
x****u 发帖数: 44466 | 14 我的原话是"不敢随便优化",因为"可能改变语义"。
你给我举个例子是只引用一次的全局变量,这种东西优化成常数也是可以的。。。你要
是想验证不妨写个多线程竞争的,然后如果gcc还是这么搞我就提交bug去。 |
|
x****u 发帖数: 44466 | 15 双线程竞争写一个全局变量时gcc把它优化成两个的例子。 |
|
x****u 发帖数: 44466 | 16 在例子出来前我还是怀疑GCC能否真的为了优化破坏全局变量语义。 |
|
x****u 发帖数: 44466 | 17 OK。那我就把这个问题简化一下了。
书写C/C++多线程程序时,如果定义了多线程共享的全局变量,是否一定要加上
volatile修饰符以保证gcc不在极端的情况下对其优化。
你认为有必要吗?
volati
still
not
optimizatio |
|
x****u 发帖数: 44466 | 18 你不要太激动,我也是在研究这个细节。
我在VC上编译你这个程序得到的汇编也一样,说明这个行为普遍存在,不管符合不符合
语法,在多线程的全局变量前一定要加上volatile防止编译器自作主张cache值。
这个是没有volatile的
00321002 in al,dx
00321003 and esp,0FFFFFFF8h
unsigned int x=0;
00321006 xor eax,eax
global_var = 1;
for (long long i=0; i<10000000000L; i++) {
00321008 xor edx,edx
0032100A mov dword ptr [global_var (323378h)],1
00321014 xor ecx,ecx
00321016 add edx,1
00321019 adc ecx,0
0032101C cmp |
|
x****u 发帖数: 44466 | 19 没人说任何情况加volatile保证对,但本程序加上了就是保证对。
因为这个线程必须是单一函数,不可能被优化成内联。func1里面就一条语句,所以不
用担心被编译器或者CPU乱序掉。
我从本楼的开始就强调锁和volatile是两回事,这个优化是否改变global的行为是半路
插过来的,不是我举的例子。要是什么全局变量都上atomic,还不如用java了。 |
|
k*******d 发帖数: 1340 | 20 Valgrin好像只有Linux版的,Windows下用啥?
从根本上解决还是用smart pointer吧
第二个问题,可能是全局变量的constructor 出问题? 在那些constructor里面设置断
点?如果这还找不到,那就不知道怎么办了。。 |
|
P*****o 发帖数: 1077 | 21 好像这个数组不是局部的,不是函数内部的数组,是一开始就定义好的,属于全局变量? |
|
p*********9 发帖数: 277 | 22 谢谢回答.有些confusing
因为我定义的这几个矩阵都回定义成全局变量,所以我就用了这样的定义.
如果定义正下面的样子:
void myfun(int time, double *A, double **B)
有什么大的优势呢?毕竟这个矩阵都很小阿。 |
|
g**e 发帖数: 6127 | 23 thread B may never jump out of the loop, even when flag is changed from 0 to
1.
you should use volatile key word for flag. |
|
M**u 发帖数: 10158 | 24 在用了volatile,防止compile的优化后,
还需不需要用lock呢?
to |
|
|
|
g**w 发帖数: 969 | 27 看thread A的任务是啥,需要多少时间完成
如果B等的时间极短,比如几百,几千个cycle,可以用你的方法,类似spin lock,不停
的poll
如果时间很长,就用kernel mode的event之类,B wait on event, A signal event
when its task complete.
如果介于两者之间,用windows下类似critical section之类的,内部实现就是先spin
一会,如果不能acquire, switch to kernel mode wait. |
|
M**u 发帖数: 10158 | 28 等待的时间比较随机,取决于别的模块是不是正常工作。。。
还是用pthread_cond_wait/pthread_cond_signal了
spin |
|
t****t 发帖数: 6806 | 29 use atomic if you can. volatile should work as well, but it is not as good
as atomic. for one thing, atomic R/W includes memory barrier. |
|
M**u 发帖数: 10158 | 30 恩
我觉得这两都是worked,但是我不知道哪一种最好,目前是用atomic了
谢谢了。。。 |
|
|
F*******i 发帖数: 190 | 32 hi thrust,
can you give more insights about the atomic? is it a keyword or something
eles?
thanks! |
|
t****t 发帖数: 6806 | 33 it's part of c++0x. basically it's (volatile when needed) + barrier. |
|
n*********i 发帖数: 567 | 34 不需要加锁。如果你希望B response快,就像现在这样不停的CHECK。如果间隔时间长
,希望省一些CPU,就加个EVENT之类的。 |
|
m*****n 发帖数: 204 | 35 Volatile is not safe because reads and writes to a volatile variable are not
memory barriers. I remember reading something on William Pugh's web site.
His write up is in the context of java but applies to C as well. Basically,
volatile forces the optimizer to keep the memory access, but it does not
prevent the compiler from moving the read/write around. Therefore, the write
to flag by thread B may be moved forward, to somewhere when the work is not
done yet. |
|
m*****e 发帖数: 4193 | 36 avoid volatile at all cost. |
|
g**e 发帖数: 6127 | 37 你说的是c++的? java里的1.5以后没啥不能用的 |
|
s*******e 发帖数: 432 | 38 I thought you still need to lock the flag. Thinking about the following
situation: after your thread read flag value into the register and before
setting flag to 1, your program is interrupted. Then thread A is suspended
and registers snapshot is stored. Later the program is resumed and thread B
wake up first. then you get a problem |
|
t****t 发帖数: 6806 | 39 你没看清他的要求, A是不读flag的, 只写1
B是不写flag的, 只读1
只要顺序不错(即有barrier), 不需要lock
before
B |
|
y**b 发帖数: 10166 | 40 看了第三版(跟第二版还是有些改动)的item 18,
这个Month类是想设计成一个静态类(类似于一个全局变量)来用:
class Month {
public:
static Month Jan() { return Month(1); }
...
private:
explicit Month(int m):val(m) {}
static int val;
};
你说的两种做法效果相同(效率不同),因为整个Month类就是一个
静态类,返回值是否声明static Month应该没有影响,作者的办法
看似return local obj, 实际return static obj。 |
|
s*****w 发帖数: 215 | 41 问一个C++的初级问题
我在main.cpp的main函数里面call了一个function得到了一个值
我想用在别的cpp文件里,请问怎么做?
谁能写一点sample code?下面的code有问题吗?
main.cpp,
const char * myvalue;
Main(...)
{
myvalue=myFun();
}
在我的另外一个文件里面,比方说myfile.cpp
怎样使用这个myvalue这个variable呢?
myfile.cpp里面就一个方法:
Method(para.)
{
//请问在这里我怎样call到myvalue的值?
}
多谢! |
|
d****n 发帖数: 1637 | 42 in myfile.cpp
extern char *myvar ; |
|
O*******d 发帖数: 20343 | 43 在大项目里,用extern会有很多问题。抄一段网上的
The "extern" declaration in C is to indicate the existence of, and the type
of, a global variable or function. A global variable, or a global function,
is one that is available to all C modules (a single C module is typically a
single .c file). An extern is something that is defined externally to the
current module. In many cases, you can leave off the extern qualifier and
not notice any difference because the linker can collapse multiple
definitions to one. But the in... 阅读全帖 |
|
|
e********y 发帖数: 66 | 45 我有一个在Visual studio 6 下开发的mfc的dll project,暂且叫它a.dll。现在想用cpputest来对其中每个class做unit test。对这个project不是很了解,主要是对windows的用visual studio开发的东西不熟,文档也没有,开发的人也走了。
这个project本身好像是个类似ocx的dll,它只export了DllGetClassObject,DllCanUnloadNow,DllRegisterServer,DllUnregisterServer这4个函数。这个dll本身好像是给别的ocx控件提供服务的。
为了unit test, 我在这个project中加了一个含有main函数的test.cpp文件,另外新加了一个configuration用来编译成win32 console。在test.cpp的main中调用afxwininit来支持mfc。试着做了一个简单的cpputest测试例来测试其中的某一个class,编译和跑测试例本身好像没问题。但是在程序退出时总有run time error的exception。跟踪进去发现P... 阅读全帖 |
|
y**b 发帖数: 10166 | 46 多谢pptwo and goodbug! 按这个思路做了,感觉不错,有几个问题再请教一下:
1. 这个singleton维护的hashmap类似于一个全局变量,无需传递函数参数,
任何对象和函数都可以取用,很方便,可是总觉得有点特别。想问一下这样做
很普遍吗?有个实验室开发的一个大型面向对象程序包,读入数据之后进行了
无数的分离和传递,直到每个用到(不同数据部分)的对象都完全用local的数据
结构来维护所需数据,好处是各个对象显得high cohesion, 缺点是非常繁琐、
数据冗余很多。你们觉得那种设计更好?
2. pptwo: You got great flexibility by not hard-coding all the parameters
in that singleton class. 这句话怎么理解?我想把所有数据一次性读入到
该singleton class,这样失去flexibility?
3. 大量进程读(一次)一个小文件(比如singleton class存储的内容)开销不大,
但是读那些很大的数据文件开销可能很大。比如我在该singleton cla... 阅读全帖 |
|
b***i 发帖数: 3043 | 47 在card.cpp里面附初值,在card.h定义这个常数数组。既然常数,可以static,基本就
是全局变量。wujiang.h里面include "card.h"
cpp |
|
a**e 发帖数: 64 | 48 从性能考虑的话,不同cpu最好访问内存不同地址,好像这样cache利用率最高。如果所
有线程只访问一个全局变量只读的话,我觉得应该影响不大。有没有大牛能核实一下? |
|
g*****s 发帖数: 1288 | 49 好像有些style扯蛋。
>禁止使用exception, 因为exception是变相的 long goto. 你甚至很难找到exception
到哪里去了
exception 在Java里无处不在。
>tab必须变成空格。
什么道理?来一个全局变量名替换,所有对齐作废?Python怎么办? |
|
b***i 发帖数: 3043 | 50 最新进展,这个不是CF本身问题,是嵌入式软件问题。
发现的问题:文件内容被覆盖到文件目录去,该文件的目录项(以及附近同一个扇区的
所有目录项)消失,从而,api不能继续写入文件。
原来的嵌入式软件执行一个无限循环,里面做所有的事情。后来用了第三方的TCP/IP的
软件,估计使用了一些函数指针把CF的api记录了。这样我觉得可能ftp的时候,第三方
的软件直接呼叫了CF API,这些api都是不可重入的,里面有全局变量,比如纪录当前
正在写哪个缓冲区。这个绝对可以造成同一个内容被写入不同区域。我看这个探测CF里
面重复区域的任务不用做了,下面的任务就是确定这个原因,然后需要手写semaphore
级别的东西,因为原来没有使用操作系统,无法实现这些功能。 |
|