謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

C言語が遅いわけ分かった気がする

C言語のコードをまともに読んだの始めてだったかもしれ。
GCが無いとfreeのせいで全てをヒープに取るしか無くなるから遅くなる訳だ(strdupだらけ。いや他の方法も無くは無いけど。)。
配列の中の途中のポインタもfreeしないように気をつけないといけないし。
アルゴリズムを工夫するかBoehm GCを使うかした方が楽と。
ってかfreeする時にアドレスの範囲を使ってヒープか.rodataセクションか判断できると思うんだけどなぁ…。(.text、.bss、.data、.stackもfreeする必要無しと)
検索したらshinhさんがポインタの正体チェックを既にやってるのでそこら辺からパk…参考にしてやろうと思います(ただメモリ配置って何かによって異なったような? 移植性も悪いし。 まぁいいか)。

extern void end;
inline void safefree(void *ptr){
  if (&end > ptr)return;
  if ((void*)&ptr < ptr)return;
  free(ptr);
}

#include <stdlib.h>
#include <string.h>

int main(){
  char str[]="Hello World!\n";
  char *str2=malloc(10);
  strcpy(str2, str);
  safefree(str);//stack
  safefree(str2);//heap
  safefree("Hello World!\n");//data
  return 0;
}


あと、関係ないけどchar **型を使ったコードを作る予定。reallocで2倍2倍していって最後に纏めるのが早いはず。
連結リストをあまり使ったこと無い俺にとってどっちが早いかは知らないけど。
でもstrdupがある限りはなぁ。gcの性能ってどんなもんなのだろうか。