トップページ⇒tech
108コメント28KB

グローバル変数について議論するスレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
グローバル変数のここがいい!ここが悪い!
こういうときはグローバル変数以外に解決法があるのか!
などうぞうぞしゃべくるスレ
0002デフォルトの名無しさんNGNG
ステータステーブル
0003デフォルトの名無しさんNGNG
ネタ?
ソレトモマジデワカランノ?
0004デフォルトの名無しさんNGNG
寝た
だから寝ろ
0005デフォルトの名無しさんNGNG
時代はグローバルスタンダード
0006デフォルトの名無しさんNGNG
>>3
なにが?
グローバル変数の良し悪し?
0007デフォルトの名無しさんNGNG
    ∧ ∧         / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ̄ ̄( ゚Д゚) ̄ ̄|   <  寝る!
|\⌒⌒⌒⌒⌒⌒\   \
|  \           \    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\  |⌒⌒⌒⌒⌒⌒|
  \ |_______|
 
0008デフォルトの名無しさんNGNG
>>7
永久におやすみ
0009デフォルトの名無しさんNGNG
クラスはグローバル変数
以上。
0010デフォルトの名無しさんNGNG
> クラスはグローバル変数
ハァ?
0011デフォルトの名無しさんNGNG
srand()とrand()の関係はグローバル変数を使わずに実現可能か?
C言語の範囲内で答えてくれ!
できるというやつは方法を言ってくれ!
言わないやつはできないやつだ(=言いたくないというのはできないと言っている)!
0012デフォルトの名無しさんNGNG
> C言語の範囲内で答えてくれ!
関数内の静的ローカル変数でやれ。
001311NGNG
>>12
それじゃsrand()で種を作れないでしょ?
二つの関数で値を渡しあうんだよ?
0014デフォルトの名無しさんNGNG
int* get_instance_ptr(void) {
static int instance;
return &instance;
}
001511NGNG
>>14
なるほど!
メリットは感じられんが…
0016デフォルトの名無しさんNGNG
ttp://member.nifty.ne.jp/nakamula/cb.c
これはグローバル変数の好例では?
0017デフォルトの名無しさんNGNG
変数のスコープなんて気にするな
最初はすべて公開
衝突したらprefix付けそれで駄目なら初めてstaticにしろ
0018デフォルトの名無しさんNGNG
ttp://www.cmagazine.jp/src/kinjite/c/variable.html#index10
みれ
0019デフォルトの名無しさんNGNG
>>17ってアホ?
北京原人?
それとも秩父?
0020デフォルトの名無しさんNGNG
 チューンナップの為に、プロファイリングを取るときにはグローバル変数を使うと
便利かも。最終的には全部消すし、そのために関数の引数を全部直すのとかめんどいし。
0021デフォルトの名無しさんNGNG
>19
ハァ?
必要ないかもしれない部分に最初からコストかけてどうすんだよ。
必要になってからやるのがプロの業だ。
0022デフォルトの名無しさんNGNG
さりげなくコボラ出身者のかほり。
0023デフォルトの名無しさんNGNG
>>21
ハァ?
なんでローカル変数にするとコストとかかるんだよ?
最初っからあるべき場所に置けばいいじゃんか。
ローカルでいいものを何でわざわざグローバルにするのか?
小規模のものを一人でしか作ったこと無いんだろ。 やれやれ。
0024デフォルトの名無しさんNGNG
グローバル変数とローカル変数って、実際どっちが使われること多いんですか?
0025デフォルトの名無しさんNGNG
>>24
ローカル変数。
グローバルはよっぽどのことがあるときかオヴァカしか使わない。
0026デフォルトの名無しさんNGNG
>>24
ほぼ全てローカル変数だろ?
グローバル変数は しかたがなく 使うものだよ。

最近の言語とまともなプログラミングの知識があればグローバル変数なんて
一切使わなくても大丈夫だけどね。
((特定条件下での)パフォーマンス以外の理由でグローバル変数を使う理由が見つからない)

>>9
Singleton の概念やね。
でも最近の言語なら名前空間に守られてるし。
0027デフォルトの名無しさんNGNG
グローバル変数はエディタを分割表示したり
スクロールしたりしたりしないといけないので嫌いだ。
管理コストかかるぶん
グローバル変数のほうが効率悪い

>>24
マトモなプロジェクトならグローバル変数は極力使うなって
標準機約にあるはず。
002827NGNG
ただし組み込みでスタックが少ない、または遅い場合以外ね
0029デフォルトの名無しさんNGNG
ttp://www.cmagazine.jp/src/kinjite/c/variable.html#index14
みれ
0030デフォルトの名無しさんNGNG
// global.h
class g_{
public:
  static void setSexFriend(string s) { SexFriend = s; }
private:
  static string SexFriend;
};

// main.cpp
static string g_::SexFriend;

void hoge(){
  g_::SexFriend("綾子11歳")
}
0031デフォルトの名無しさんNGNG
>>30
http://ftp.sk-kaken.co.jp/compile_error-01.wav
女子高生プログラマ つきねこ15歳「コンパイルエラー、です」
0032デフォルトの名無しさんNGNG
激おそレスだが...。

>>11
インターフェースはそのままか ? だったら、難しいな。(でも、ファイル
スコープにはしろよ。) 単に同じ機能が必要と言うだけなら、シード (+ 管理)
領域を呼び出し側で取ってもらって、引数でポインタ渡しすればいいだけ。
でも、ネストが深い関数中で呼び出すことを考えると面倒だよね。
だから、グローバル変数で作ってるわけだよ。わかった ?
逆にいうとグローバル変数のメリットって (引数渡しをサボることによって得ら
れるわずかな性能向上と) "これ" ぐらいだよ。

>>16
好例 ? マジですか ?

>>17
突っ込む気もおきんわ。放置しとこ。

>>26
> Singleton の概念やね。
なんか、勘違いしてるような...。

>>27
> グローバル変数はエディタを分割表示したり...
なんで、作成時しか気にしない ? グローバル変数のデメリットってデバッグ時や
保守の時に一番感じると思うが...。サンデープログラマですか ?
0033デフォルトの名無しさんNGNG
読み肉い、却下
0034デフォルトの名無しさんNGNG
恋人にするならローカル変数
結婚するならグロ―バル変数
0035デフォルトの名無しさんNGNG
当たり前の事言ってもいい?
一度でもフルアセンブルで、しっかりプログラム書いてみれば、
グローバル変数と構造体の使い道がはっきり見えるってもんだろ。
共用体を使いこなす、これ最強。
0036デフォルトの名無しさんNGNG
追伸。グローバル構造体マンセー
0037デフォルトの名無しさんNGNG
struct global g{
  int MailFriendCount;
};
g::MailFriendCount = rand();
0038デフォルトの名無しさんNGNG
>>34
普通逆じゃないか?
グローバル変数は浮気しまくりの美人だぞ?
00399NGNG
Metaclassクラス のインスタンスをグローバル変数にしないでどうするのかと…
0040デフォルトの名無しさんNGNG
以前に似たスレを見たきがするぞ
0041デフォルトの名無しさんNGNG
>>38
それを言うなら局所変数は一回ヤって終わりじゃねーかYo!
0042デフォルトの名無しさんNGNG
俺、クリティカルセクションをローカル変数で定義して
きちんとロックした気になってるソース見たことあるよ。
0043デフォルトの名無しさんNGNG
>>9は変数とポインタの違いが判ってないヴァカ
0044デフォルトの名無しさんNGNG
>>43は粘着
0045デフォルトの名無しさんNGNG
>>44はちんぽ
0046デフォルトの名無しさんNGNG
>>44は一言多い
0047デフォルトの名無しさんNGNG
>>43
言ってみたいだけちゃうんかと…
0048デフォルトの名無しさんNGNG
グローバル変数を毛嫌いするやつはグローバル変数を適切に扱えてないだけ、
グローバル変数をむやみに使うやつはグローバル変数の危険性を知らないだけ。
0049デフォルトの名無しさんNGNG
グローバル変数について議論する奴はOOを知らないアフォ
0050デフォルトの名無しさんNGNG
マクロスの艦長?
0051デフォルトの名無しさんNGNG
これからはグローバルの時代なのでは?
0052デフォルトの名無しさんNGNG
大きなテーブルはグローバルか共有メモリじゃない?
グローバルならstaticつけてスコープをファイル内にするんだろうけど

コボラーの人は使う変数全部1箇所に集めたがる人もいるかもしれませんね
0053デフォルトの名無しさんNGNG
stdinやらのファイルディクスリプタは
グローバルじゃないとつらいな・・・
0054デフォルトの名無しさんNGNG
俺、>>52みたいな奴がプログラム書いてると思うとゾッとする。
確かにグローバル変数の使い方は微妙かも知れないが、その前に
プログラマはC言語を正しく理解しているのかと50時間問い詰めたい。
0055デフォルトの名無しさんNGNG
>>38
>>41

不覚にもワラタ。(どっちの言い分も、一理ある)
0056デフォルトの名無しさんNGNG
動的なモデリングばかりやってるから、変なグローバル変数が
増えてくるのさ。
静的に見ると、必要なグローバル変数が見えてくるし、
ドキュメント等の管理もしやすくなると思う。
特に、組み込みメインのうちの会社では、動作のシーケンス
ばかりを考えて、訳わからんグローバル変数だらけで、
嫌になってくるよ。
005752NGNG
>>54
聞くから問い詰めてくれよ
0058デフォルトの名無しさんNGNG
>>33
理解できないなら、帰っていいぞ。
0059デフォルトの名無しさんNGNG
>>52
大きなテーブルを共有メモリに置いてどうすんだよ。その考えがバグを生む。
性^H静的変数(static)と広域変数をいっしょくたにするなよ。
まとめると、お前は変数がどこに格納されてるか考えた事はあるか?

細かい事は、お母さんに聞け。
0060デフォルトの名無しさんNGNG
// Cのグローバル化でプログラムが美しくなります!
// 関数は↓以外禁止の方向でお願いします!!

void func ( void ) ;

006152NGNG
>>59
悪い
プロセス間で共有したいデータは共有メモリにおくでいいか?
006252NGNG
>>59
>>性^H静的変数(static)と広域変数をいっしょくたにするなよ。

ファイルスコープはグローバルスコープではないと言いたいのならそうですね
関数外で宣言した奴はstaticつけてても癖でグローバルと呼んじゃう。
(でグローバルが話題になってるとファイルスコープもグローバルの仲間にいれちゃう)
日本語と感覚がおかしくてすまん
0063デフォルトの名無しさんNGNG
>>52
共有メモリってのは言い換える所のシステムメモリであって、見えない
ボトルネックの原因になりやすいんだよな。システムに常駐するような
ソフトウェアでも書かない限りは、出来るだけ使用を割けるべき。
ましてテーブルみたいに巨大かつ不変なデータは絶対置くべきでないよ。

globalとstaticの違いってのは、確かに表向きにはスコープの違いに
見えるが、実際はプログラムの起動時に、あらかじめ領域が確保された
global変数と、宣言されてメモリを割り当てられた後、開放される事のない
static変数ってゆう違いがあるんだよ。メモリを大量に積んだPC環境では
問題に気づかないかも知れないが、メモリリークの原因に成り得る、
言わば誤用=バグ。
オチがなくてスマソ
0064デフォルトの名無しさんNGNG
:s/割ける/避ける/
0065デフォルトの名無しさんNGNG
staticがメモリリークとするとは初耳だ。
↓のようなことを言っているのか?

void func()
{
  static int* buffer;
  if(buffer){
    buffer = new int[10000];
  }

}

グローバル変数やクラスメンバ変数でも同じだが。

static int static_buffer[10000];
static int *global_buffer
0066デフォルトの名無しさんNGNG
63じゃないけど、確かにstatic多用はメモリリークの原因になるぞ。
使い方次第だとは思うが。
0067デフォルトの名無しさんNGNG
メモリリークになるような static の使い方を教えれ。
0068デフォルトの名無しさんNGNG
無知ですまんが、漏れは性的変数(static)もグローバルも実行時に領域確保だと思っていたよ。
どうなの?staticはヒープに取られるの?スタックに取られるの?
それとも元から確保する領域(名前忘れた)に取られるの?
根拠となる文献やサイトを提示して教えてください。
C使えるけど、システムなんか組んだことないんだよね。ゲーム屋だったから。
006966NGNG
過去に謎のメモリリークに悩んだ挙句、性的変数をグローバルに変更した事で
解決した事が何度かあったよ。理屈はワカラン。。。
俺の知ってる浅い知識だと、性的、広域変数はスタックでもヒープでもない
固定領域、使い捨て変数(自動変数)はスタック、mallocとかで動的確保/ポア
されるのはヒープってのが普通だったような。
50時間過ぎてるな。
007052NGNG
漏れは外部的なstaticのことを言ってるんですが
こういうのも気をつけたほうがいいの?

例
static hoge_t hogege;
void put_hoge(int hoge){ hogege.hoge = hoge; return;}
int get_hoge(){return hogege.hoge;}
・・・
007166NGNG
>>54の人が帰ってこないので俺の見解。
メモリリークが起こった原因は、コンパイラの最適化の不具合かと。
007252NGNG
調べてもよくわからないんで 63を素直に読むと
externできる領域については最初に大きさがわかってるからその大きさで
プログラム起動時に割り付けられる
staticつける静的領域ってのは外部だろうが内部だろうが コンパイラが
あらかじめmax値決めてて初期化されるときに割り付けられる。
のでスタックオーバーフローと同じ理屈でメモリが割当てられなくなる
ことがあるって理解でよいですか?
0073デフォルトの名無しさんNGNG
>>72
言うなら、ヒープオーバーフローってことか?
ホントか?ガセか?
ホントに良くわかってるヤツ出て来いщ(゜ロ゜щ)
0074デフォルトの名無しさんNGNG
static char str[100]; // 未初期化storage(fill zero)
           // ほとんど実行ファイルに含まれない
           // 実行時にOSなどで作成
static int num=100; // 初期化storage
          // ほとんど実行ファイルに含まれる
          // 実行時にたんにロードされる
static Class xx; // Cライブラリでmain前にコンストラクタが走る
         // デストラクタはmain後。exitとかしると
         // 実装によってはデストラクタ呼ばれず。
         // 実装によってはatexitの様にして
         // デストラクタが処理される
Class& Instance(){
static Class xx; // はじめてInstanceが呼ばれるときに
          // コンストラクタがはしる
          // デストラクタはmain後...以下同
return xx;
}
0075デフォルトの名無しさんNGNG
>>74
つまり、メモリリーク(リソースリークが適切か?)は、
「static」「デストラクタ」「exit」の組み合わせで、
実装依存で起きるってことか。
発生確率が微妙なのがいやらしいな。
exitしなきゃいいんだろうけど。
0076デフォルトの名無しさんNGNG
exitなどしないでも、staticなClassインスタンスは普通はいやだなー。
デストラクタ呼ばれる順番もいいかげんだし、
そのデストラクタ内で例外おきたら結局unexpectedだし。
0077デフォルトの名無しさんNGNG
sage
0078デフォルトの名無しさんNGNG
割り込み使って書いていたら、
void func(void)
で、グローバルだらけになってしまったよ。
鬱。。。
0079デフォルトの名無しさんNGNG
変数がデフォルトでグローバルのPerlは逝ってよしということでよいかな?
0080デフォルトの名無しさんNGNG
>>66
じゃあ定数はあまり使えませんね。
0081デフォルトの名無しさんNGNG
ユーザプロセス終了してもメモリ空間が残る様な
チンカスな OS は嫌だな…
0082harukaNGNG
少なくともCとC++では
staticでもグローバルでもメモリ的にはほぼ同じ扱いだよ。
どっちかがメモリリークの原因になるとかそんなのは迷信としか思えないよ。
0083デフォルトの名無しさんNGNG
>>79
言語に罪はない。
適材適所ができない奴が逝ってよし。
0084デフォルトの名無しさんNGNG
グローバル変数であなたも幸せになれます
0085デフォルトの名無しさんNGNG
>>84
まじかよ!
もうauto変数の使用はやめよう・・・
008685NGNG
違う違う・・・
ローカル変数の使用はやめよう。
0087デフォルトの名無しさんNGNG
グローバル変数は使うな。
0088デフォルトの名無しさんNGNG
無駄にスタックを使うプログラムは低速になります。
高速なプログラムを書く為にはグローバル変数を使いましょう。
変数名の明確なルール、排他処理ができていれば弊害はまず起こりません。
0089デフォルトの名無しさんNGNG
>>87
やり方を教えてください。
使用言語は N88-BASIC を使っています。
009089NGNG
>>88
先輩から変数は1文字にしろ!
最初に全部宣言しろ!
文字型は固定サイズで確保して再利用しろ!

と教わりますた。
0091デフォルトの名無しさんNGNG
88はネタか?
話にならん(w
0092デフォルトの名無しさんNGNG
転職をマジで考えろ >>90
0093マジレスしてやれNGNG
>>89
N88-BASICでは言語仕様でローカル変数がサポートされていないので
名前付け規約・コーディング規約で対処したことがあります。
具体的には、変数名をサブルーチン名_変数名って感じにして
サブルーチン外からは直接アクセスしてはならないと決めました。
ちなみに、戻り値・引数はサブルーチン名_IN_引数名や
サブルーチン名_RETのように行いました。
0094デフォルトの名無しさんNGNG
>>90
その先輩って食べさんだったりして。
0095デフォルトの名無しさんNGNG
Cで、

const int giko;

のスコープが、そのファイルのみになるのが納得できません。
0096デフォルトの名無しさんNGNG
>95
基本的にCの文法がわかっていないだけ。
教えて君スレにいけ。
0097デフォルトの名無しさんNGNG
>>95
なりません。
0098デフォルトの名無しさんNGNG
staticと勘違いか?
0099デフォルトの名無しさんNGNG
>>91
間違ってはいないと思うぞ。

ただ、実際に効果が出るかどうかは別。
0100デフォルトの名無しさんNGNG
>>1へ。
多分宿題だろ?



int a()
{
printf("%d",giko);
}


gikoがどこでどのように変更されるのか。
それを解析するのって地獄よ?正直。
0101デフォルトの名無しさんNGNG
staticと内部リンケージとを取り違えてるのではなかろうか>>95
0102デフォルトの名無しさんNGNG
>>96
その文法が納得できないという意味かと思われ

>>95
グローバル変数の参照はオブジェクトがリンクされる時に解決される。
このときリンカーは、グローバル変数が静的にアクセスされるかどうか
判断しようがない。
だから、静的変数のスコープはローカルファイルのみになったと思われ。
0103デフォルトの名無しさんNGNG
>102,95
グローバル変数、関数への参照はextern宣言されていなければ
実態が同一ファイルにあるものとコンパイラがみなすのでその時点で
エラーとなる。
0104デフォルトの名無しさんNGNG
>>34 >>38 >>41
staticなローカル変数が一番。
0105デフォルトの名無しさんNGNG
>>103
そうか?
0106デフォルトの名無しさんNGNG
「憂鬱なプログラマの〜」の「状態の管理」のところを読め。
そうすりゃグローバル変数の使い方がわかる。
0107デフォルトの名無しさんNGNG
MotifでGUIを描くプログラムを書いたときは、
グローバル変数がテンコ盛になってしまつた。
0108デフォルトの名無しさんNGNG
C++なんですけどローカル変数で
static const double sin_theta = sin(THETA); // THETAは定数
static const double k = 1.0 / sin_theta * sin_theta;
みたいなのは良くないんでしょうか。
Cだとエラーが出ましたがC++だと通りましたし、
計算結果も一致しています。
■ このスレッドは過去ログ倉庫に格納されています