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 以外的引用都有 : 可能分配到寄存器。
|
|
|
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 了。
|