Re: ネットワークのタイムアウトについて ( No.1 ) |
- 名前:管理人 日時:2015/09/16 02:36
お察しの通り SetConnectTimeOutWait の引数の Time の単位はミリ秒です
デフォルトは 2000 で、2秒となっています
> 教科書通りだと #defineが忌み嫌われておりますが、自分は数値は()で括れば問題がないのと思っているので #define派です。
> const化はデバッグで値の確認が可能という長所がありますが、リリースでは実行exe内に一定の固まりで格納されるのでチートされ易い気がするのですが…?
私はある環境でヘッダファイルに #define の代わりに const を使用して、そのヘッダファイルを色々な
ソースファイルでインクルードしたところ、インクルードした全てのソースファイルに const で書いた定数値が
メモリに配置されてしまいメモリ不足になったという経験があるので、ただの置換である #define はそのような
ことがなく安心なので const は殆ど使わなくなってしまいました・・・
私は const がメモリ上でどのように扱われているかについて詳しくありませんが、もし一箇所に固められるのでしたら
確かに #define よりチートのされやすいかもしれません
( チートする方にとっては手間が少し増えるかどうかくらいの違いでしかないかもしれませんが・・・ )
|
Re: ネットワークのタイムアウトについて ( No.2 ) |
- 名前:さと 日時:2015/09/23 12:55
お世話になっております。
>メモリ不足
なるほど、そういうのもありえますか
86系では知らないのですが、
ARMでは仕様上、ローカルなイミディエート値はすべてアドレス指定でレジスタへセットされるので、
関数の終わった所に、その関数で使用しているデータが配置されます。
この場合は、#defineでもconstでも同じだったような気がします。
冗長なプログラムをアセンブラで書くと「必要な値にアドレスが届かない」とかリラティブなブランチができないとか(?)
なんだかそんなのあった気がする…。
|
Re: ネットワークのタイムアウトについて ( No.3 ) |
- 名前:管理人 日時:2015/09/24 01:26
> ARMでは仕様上、ローカルなイミディエート値はすべてアドレス指定でレジスタへセットされるので、
> 関数の終わった所に、その関数で使用しているデータが配置されます。
> この場合は、#defineでもconstでも同じだったような気がします。
例えばあるグローバル変数を他のソースでも使用したい場合、ヘッダファイルには
extern int c ;
と、extern をつけて、実体は一つのソースファイルでだけ
int c ;
としますよね?
このようにすれば当然ですが extern int c ; と書かれたヘッダファイルを沢山のソースファイルで
インクルードしても変数 c で消費するメモリは int 型変数1個分になるわけですが、例えばヘッダファイルに
static int c ;
と書いてしまったら、このヘッダファイルをインクルードしたソースファイルは変数 c を使っていても
使っていなくても変数 c 用のメモリが確保され、全体でのメモリの消費量は
インクルードされた数+int 型変数1個分となってしまいます
私が経験した状況はまさにこれで、例えば
const int INPUT_A = 0 ;
const int INPUT_B = 1 ;
const int INPUT_C = 2 ;
const int INPUT_D = 3 ;
const int INPUT_E = 4 ;
と書いた場合は
static int INPUT_A = 0 ;
static int INPUT_B = 1 ;
static int INPUT_C = 2 ;
static int INPUT_D = 3 ;
static int INPUT_E = 4 ;
と同じ挙動がされてしまう、というものでした
ヘッダファイルには const int の定義が数百あり、そのヘッダファイルをインクルードしたソースファイル
全てで、定義を使用していても使用していなくても書かれている const int 分のメモリが確保されてしまい・・・
という悲惨な事態になっていました・・・
|
Re: ネットワークのタイムアウトについて ( No.4 ) |
- 名前:さと(解決) 日時:2015/09/24 20:23
>const int 分のメモリが確保
なるほど、そういうことになりますね。
#defineの短所を知っているなら問題なーい
初心者が間違えやすいから敬遠されてる感じ…。
|