Redian新闻
>
问个C++编译器如何处理函数内的static 变量
avatar
问个C++编译器如何处理函数内的static 变量# Programming - 葵花宝典
r*a
1
本人目前状态仍是F visa (OPT) on 2008/12/1: non-resident (stay in US less
than 5 years) for whole 2008.
前两天用TAXCUT报税,只注意到对于州税他们区分non-resident/resident,没有注意到
自动天的联邦税竟然是FORM 1040,而不是1040-NR(EZ),已经用E-FILE submit,昨天
打印出来才发现表格填错了,但是我的州税应该没问题。
请问大家,这种情况有问题么?我还可以重新填1040-NR(EZ)么?如果不重新填会出现
什么情况?如果一定要重新填/寄我还需要对IRS解释这个情况么?
十分感谢!!!!!!!
avatar
w*r
2
大家好,
请教一个485的问题。
我最近在准备485的申请材料。发现在前人的checklist中,老婆的checklist上有子女
的出生证明和公证。我们有一个未成年儿子,在国内,没有出国过。我们需要把孩子的
出生证明和公证放在checklist吗?孩子不会和我们一起申请。多谢!
avatar
f*w
3
void foo()
{ static int i;
// ......
}
假设我有这样一个static变量,如果有两个线程按如下时间顺序调用foo(),
T0:第一个线程把i设为3,
T1:第二个把i设为5,
T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),
T3:现在i的值应该是多少?
这个过程编译器是如何对i进行操作的?
请指教
avatar
d*b
4
fill in 1040NR-X, together with correct 1040NR form, you can correct up to 5
years

【在 r*****a 的大作中提到】
: 本人目前状态仍是F visa (OPT) on 2008/12/1: non-resident (stay in US less
: than 5 years) for whole 2008.
: 前两天用TAXCUT报税,只注意到对于州税他们区分non-resident/resident,没有注意到
: 自动天的联邦税竟然是FORM 1040,而不是1040-NR(EZ),已经用E-FILE submit,昨天
: 打印出来才发现表格填错了,但是我的州税应该没问题。
: 请问大家,这种情况有问题么?我还可以重新填1040-NR(EZ)么?如果不重新填会出现
: 什么情况?如果一定要重新填/寄我还需要对IRS解释这个情况么?
: 十分感谢!!!!!!!

avatar
s*e
5
<< T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),
应该打印5. 你可以想象static 相当于全局变量。
avatar
r*a
6
Do you mean form 1040X? I couldn't find 1040NR-X online.
Is it required?
Thanks.

5

【在 d*b 的大作中提到】
: fill in 1040NR-X, together with correct 1040NR form, you can correct up to 5
: years

avatar
f*w
7
我也是这样说的,但面试的人说应该是3。我也没有其他的问题答错,就被拒了。
avatar
Q*Q
8
1040NR好像也没法e-file,所以你还是寄吧

【在 r*****a 的大作中提到】
: Do you mean form 1040X? I couldn't find 1040NR-X online.
: Is it required?
: Thanks.
:
: 5

avatar
m*e
9
It depends on compiler optimization. The interviewer fails.

【在 f**********w 的大作中提到】
: 我也是这样说的,但面试的人说应该是3。我也没有其他的问题答错,就被拒了。
avatar
r*a
10
现在的情况是,我已经误填了1040,然后efile了!
大家谁知道如果我再填1040NR 寄过去会影响结果么?该怎么做呢?谢谢了!!!
avatar
u*u
11
其实这个问题根本没有一定的答案的,关键就看你怎么处理各种操作,所以你要分析出什
么情况下会出什么结果,如果你咬定说是一个结果,不管是什么,都说明你对多线程没有
什么概念.一般你不需要知道很复杂的概念,但是至少你要能看到这种东西就知道提高警
惕,否则就等于闭着眼睛开车,天知道什么时候会出问题.
另外,"这个过程编译器是如何对i进行操作的"这种话是很有歧义的,如果面试的人听到
类似的话,很容易的就怀疑你到底对一些基本概念是不是真的理解.

【在 f**********w 的大作中提到】
: void foo()
: { static int i;
: // ......
: }
: 假设我有这样一个static变量,如果有两个线程按如下时间顺序调用foo(),
: T0:第一个线程把i设为3,
: T1:第二个把i设为5,
: T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),
: T3:现在i的值应该是多少?
: 这个过程编译器是如何对i进行操作的?

avatar
r*a
12
现在的情况是,我已经误填了1040,然后efile了!
大家谁知道如果我再填1040NR 寄过去会影响结果么?该怎么做呢?谢谢了!!!
avatar
o*0
13
编译器怎么会决定 runtime 变量值?
T2 怎么可能是3?又不是stack variable
avatar
s*x
14
等退税到帐了,再file 1040x 根正

【在 r*****a 的大作中提到】
: 现在的情况是,我已经误填了1040,然后efile了!
: 大家谁知道如果我再填1040NR 寄过去会影响结果么?该怎么做呢?谢谢了!!!

avatar
f*y
15
这篇说的好像比较详细了。
http://www.codeguru.com/cpp/misc/misc/assemblylanguage/article.php/c12897
各位看看还有什么其他的可能问题?
针对这个题干
" T2:第一个线程打印i,i的值应该是3,然后两个线程退出foo(),"
如果这个打印的值是3,那么是不是说明T1的i=5被因为没有互锁而覆盖了?所以i应该
还是3。 然后和面试官说:如果team中有人这么写程序,这个team就不值得来了. 这种
问题擦起屁股来要气死人的。
说与编译器优化有关的老大,是不是编译器优化会给这样的变量加锁呢?
avatar
d*8
16
面试时切忌只回答答案。最重要的是你的理由。即使答案错了,理由讲清楚了,表明自
己概念清楚,也不会明显失分。
首先表明态度,绝对不应该在要求THREAD SAFE的函数里写这样的代码。
然后说应该有LOCK,以及VOLATILE声明。
第三说,最好是用全局变量,这样别人调用的时候知道会有锁,会更加小心。
至于最后的答案。由于没有volatile编译器如果做了优化的话,T2打印3是有可能的。
因为还在CPU CACHE里。
如果楼主坚持打印3是错误的,表明不理解volatile,FAIL也正常。
avatar
v*u
17
admire this answer!

【在 d*********8 的大作中提到】
: 面试时切忌只回答答案。最重要的是你的理由。即使答案错了,理由讲清楚了,表明自
: 己概念清楚,也不会明显失分。
: 首先表明态度,绝对不应该在要求THREAD SAFE的函数里写这样的代码。
: 然后说应该有LOCK,以及VOLATILE声明。
: 第三说,最好是用全局变量,这样别人调用的时候知道会有锁,会更加小心。
: 至于最后的答案。由于没有volatile编译器如果做了优化的话,T2打印3是有可能的。
: 因为还在CPU CACHE里。
: 如果楼主坚持打印3是错误的,表明不理解volatile,FAIL也正常。

avatar
f*w
18
我当时是这样回答的,static变量存在内存的static data segment,虽然每个线程有自
己的local stack,但应该共享static variable,所以打印5。
当然drifter2008的回答要好得多。谢谢各位
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。