由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 随手写的C程序,请指教
相关主题
C pass string 问题面试被问到G++和GCC编译器的关系
问个c语言的问题请帮忙看看这个字符函数的错误在哪里
帮忙看看这几段程序有问题吗?问个char*的问题
Array in C请教一个C里面string copy的问题
ask for help about AMD clusterC语言大文件如何得到文件大小?
About volatile in CWhat is wrong with the constructor calling?
关于 exception 的一个问题C++ STL map find does not work ???
strcat()a c++ question.
相关话题的讨论汇总
话题: p1话题: p2话题: malloc话题: 123456话题: p3
进入Programming版参与讨论
1 (共1页)
s********k
发帖数: 6180
1
int a = 0; //data
int b; //bss
main()
{
volatile int c; //stack
volatile char s[] = "abc"; // s is in stack.
char *p1,*p2; //both p1 and p2 are in stack
volatile char *p3 = "123456"; //123456\0 in code seg or const data
,p3 in stack,
static int d =0; //data seg
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//p1, p2 in stack, pointing to address in heap
strcpy(p1, "123456"); //123456\0 in code seg or const data, compiler
may optimize p1 to same address as p3?
}
l*********s
发帖数: 5409
2
a could go into bss as well.
s********k
发帖数: 6180
3
有没有什么办法让a一定在data?加static?

【在 l*********s 的大作中提到】
: a could go into bss as well.
S*A
发帖数: 7142
4
local 那些变量有可能被优化直接去掉(dead code)。
或者直接分派到寄存器上,没有到 memory.
例如你的 c,p1,p3 等等。
特别是如果地址被只是用来做过 load/store,
没有传给其他地方的变量。

【在 s********k 的大作中提到】
: 有没有什么办法让a一定在data?加static?
S*A
发帖数: 7142
5
我想 littblebird 想说的是0 是特别的。bss 缺省就是 0.
如果 1 就一定要 data 了。

【在 s********k 的大作中提到】
: 有没有什么办法让a一定在data?加static?
s********k
发帖数: 6180
6
优化掉确实有可能,假设这些code在别处都有用,什么情况分配寄存器?

【在 S*A 的大作中提到】
: local 那些变量有可能被优化直接去掉(dead code)。
: 或者直接分派到寄存器上,没有到 memory.
: 例如你的 c,p1,p3 等等。
: 特别是如果地址被只是用来做过 load/store,
: 没有传给其他地方的变量。

s********k
发帖数: 6180
7
改了下,应该不会再被优化了,p1,p2都有有分配memory应该不会被优化

【在 s********k 的大作中提到】
: 优化掉确实有可能,假设这些code在别处都有用,什么情况分配寄存器?
S*A
发帖数: 7142
8
另外一个function 是不能用这些变量的,不是同一个 scope。
寄存器分配完全是编译器的自由,这个 C 语言规范没有具体
规则。理论上只要地址没有干过 load/store 以外的引用都有
可能分配到寄存器。

【在 s********k 的大作中提到】
: 优化掉确实有可能,假设这些code在别处都有用,什么情况分配寄存器?
s********k
发帖数: 6180
9
当然这个是个例子,实际中肯定不会这么写

【在 S*A 的大作中提到】
: 另外一个function 是不能用这些变量的,不是同一个 scope。
: 寄存器分配完全是编译器的自由,这个 C 语言规范没有具体
: 规则。理论上只要地址没有干过 load/store 以外的引用都有
: 可能分配到寄存器。

s********k
发帖数: 6180
10
改了下,加了volatile

【在 S*A 的大作中提到】
: 另外一个function 是不能用这些变量的,不是同一个 scope。
: 寄存器分配完全是编译器的自由,这个 C 语言规范没有具体
: 规则。理论上只要地址没有干过 load/store 以外的引用都有
: 可能分配到寄存器。

相关主题
About volatile in C面试被问到G++和GCC编译器的关系
关于 exception 的一个问题请帮忙看看这个字符函数的错误在哪里
strcat()问个char*的问题
进入Programming版参与讨论
S*A
发帖数: 7142
11
p1, p2 还是可以被优化到寄存器,因为除了 load/store 没有干过其他事。
如果你用过 &p1, &p2, 那就不容易被优化掉。

【在 s********k 的大作中提到】
: 改了下,应该不会再被优化了,p1,p2都有有分配memory应该不会被优化
S*A
发帖数: 7142
12
局部变量不应该有 volatile,但是应该可以虎过很多编译起不
会碰你的 p1, p2.

【在 s********k 的大作中提到】
: 改了下,加了volatile
W***o
发帖数: 6519
13
1. malloc does not need casting
2. don't see a point of declaring a static variable inside of main() though
3. I'm new to C, so open to correction

【在 s********k 的大作中提到】
: 改了下,加了volatile
S*A
发帖数: 7142
14
GCC 结果优化掉了 p2, 连那个 malloc 也扔掉了。
p1 因为有 strcpy 没有被优化掉。
volatile 为什么加到 P3 上, p3 都没有被 assign.
.file "a.c"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB22:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movl $10, %edi
movl $6513249, (%rsp)
call malloc
movl $13877, %edx
movl $875770417, (%rax)
movb $0, 6(%rax)
movw %dx, 4(%rax)
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE22:
.size main, .-main
.comm b,4,4
.globl a
.bss
.align 4
.type a, @object
.size a, 4
a:
.zero 4
.ident "GCC: (GNU) 4.8.2 20131212 (Red Hat 4.8.2-7)"
.section .note.GNU-stack,"",@progbits
s********k
发帖数: 6180
15
你用的O3?

【在 S*A 的大作中提到】
: GCC 结果优化掉了 p2, 连那个 malloc 也扔掉了。
: p1 因为有 strcpy 没有被优化掉。
: volatile 为什么加到 P3 上, p3 都没有被 assign.
: .file "a.c"
: .section .text.startup,"ax",@progbits
: .p2align 4,,15
: .globl main
: .type main, @function
: main:
: .LFB22:

S*A
发帖数: 7142
16
gcc -c -S -O2 /tmp/a.c

【在 s********k 的大作中提到】
: 你用的O3?
s********k
发帖数: 6180
17
malloc不用casting很危险的做法,当然在这个里面倒是可以不用,static举例而已,

though

【在 W***o 的大作中提到】
: 1. malloc does not need casting
: 2. don't see a point of declaring a static variable inside of main() though
: 3. I'm new to C, so open to correction

l*********s
发帖数: 5409
18
en,还是老大牛 :-)

【在 S*A 的大作中提到】
: 我想 littblebird 想说的是0 是特别的。bss 缺省就是 0.
: 如果 1 就一定要 data 了。

S*A
发帖数: 7142
19
malloc 不用 casting 也危险不到那里去吧。
你本来就是要 save malloc 的值,不然没法 free。
malloc 是 void *, 不能直接用内存 read/write.
cast 对生成的机器代码完全没有影响。

【在 s********k 的大作中提到】
: malloc不用casting很危险的做法,当然在这个里面倒是可以不用,static举例而已,
:
: though

z********0
发帖数: 9013
20
直接说你想干嘛把?别总想把Compiler骗过去,这年头不容易骗了
C语言,全局变量总会在内存里的,用到的时候会Load到寄存器,但早晚总会写回去的
,当然了,多线程下是不安全的。
z********0
发帖数: 9013
21
然。
GCC的话,还有一法:
int a __attribute__ ((section ("DATA"))) = 0;
检验的话:readelf or nm

【在 S*A 的大作中提到】
: 我想 littblebird 想说的是0 是特别的。bss 缺省就是 0.
: 如果 1 就一定要 data 了。

1 (共1页)
进入Programming版参与讨论
相关主题
a c++ question.ask for help about AMD cluster
请问strcpy()和memcpy()的写法问题  (转载)About volatile in C
一道笔试题关于 exception 的一个问题
帮忙找个错strcat()
C pass string 问题面试被问到G++和GCC编译器的关系
问个c语言的问题请帮忙看看这个字符函数的错误在哪里
帮忙看看这几段程序有问题吗?问个char*的问题
Array in C请教一个C里面string copy的问题
相关话题的讨论汇总
话题: p1话题: p2话题: malloc话题: 123456话题: p3