GCCの最適化について試してみたんですよ。
/usr/local/gcc4.3/bin/gcc -O3 -march=pentium4 -mtune=pentium4で。
int main(){ char*s = malloc(10); char*t = malloc(10); *s++=*t++; *s++=*t++; *s++=*t++; *s=*t; free(s); free(t); return 0; }
mallocはbuiltin関数であり、結局sが使われてないので最適化して
int main(){ return 0; }
までしてしまうんじゃないかと思ったのにしてない。
以下のように最適化してくれないかと期待してたけど、それもない。
int main(){ char*s = malloc(10); char*t = malloc(10); int*s2 = (int*)s; int*t2 = (int*)t; *s2=*t2; free(s); free(t); return 0; }
ってかこのケースだとmallocをスタックを利用するように最適化してくれても良いのになぁ。
メモリがネックの今には期待外れすぎるんですが。(ちなみにmemcpyやmemsetはちゃんと最適化される。)
弄るとしたらtree-ssa-*辺り?
memcpy(ptr, "test", 4);は最適化される、*(int*)ptr=*(int*)"test";は最適化されない。
memcpy(ptr, ptr2, 4*i)は最適化されない。
//コードにすると最速はこんな感じ? long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2; int j=0; for(;j<(i<<1);j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8); if(i%2)__builtin_memcpy(ptr_64+j, ptr2_64+j, 4);
memcpy(ptr, ptr2, 8*i)は最適化されない。
//コードにすると最速はこんな感じ? long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2; int j=0; for(;j<i;j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8);
memcpy(ptr, ptr2, 16*i)は最適化されない。
//コードにすると最速はこんな感じ? long long*ptr_64=(long long*)ptr,*ptr2_64=(long long*)ptr2; for(int j=0;j<i*2;j++)__builtin_memcpy(ptr_64+j, ptr2_64+j, 8);