- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
- malloc(sizeof(char)*(strlen(s)+1))
ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
- 75 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 11:52:25 ]
- >>71
#include <stdio.h> int main() { printf("%d\n",sizeof(char)); return 0; } をCでコンパイルしてみたか? C++でもコンパイルしてみたか?
- 76 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 11:55:31 ]
- >>72
これはアブラゼミだね
- 77 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 11:56:31 ]
- >>75
CとC++でsizeof(char)は絶対1なのは仕様で保証してるんだけど・・・
- 78 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 13:19:39 ]
- 1バイトは8ビットとは限らないが、charは1バイトと規格で決まっている。
ってことでしょ?
- 79 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 13:37:00 ]
- >>75
もう帰れ無能。
- 80 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 13:40:04 ]
- >>43
Cの規格での「文字」の定義は「1バイトに納まるビット表現」。 規格書ちゃんと嫁。
- 81 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 13:43:49 ]
- >>80
文字っつーかcharな。単に文字とか言うとまた噛み付いてくるで。
- 82 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 14:01:07 ]
- >>81
>単に文字とか言うと 規格に於ける定義の話をしてるんだが。
- 83 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 14:25:58 ]
- >>82
それならきっちり「文字型」といった方が誤解ないよねとか 文字とだけ言うとシングルバイト文字とマルチバイト文字を ごっちゃにするやつが出てくるから 規格話するなら正確に みたいあn
- 84 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 14:40:08 ]
- >>75
関係ない話なんだが、 sizeof演算子の結果の型はsize_tだけど、こういう場合はintにキャストしなくていいの?
- 85 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:08:04 ]
- >>70
C++だろうとmallocは使えるでしょう? mallocしたものをdeleteしたりしなければ。
- 86 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:12:41 ]
- >>80
charが1バイトなのは当然として、 1を掛けるのを省略して書いて良いのかどうか という問題だろう。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:21:31 ]
- >>85
使えるけど、new があるのに >mallocしたものをdelete する危険を冒してまで態々使う意味が判らない。 >>86 「省略しちゃいけない」とする理由が 「文字数とバイト数は意味が違うから」であれば、 規格上は「文字」=「1バイト文字」であり 「文字数=バイト数」であるから 「省略しても問題ない」よね?という確認。
- 88 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:35:24 ]
- 問題は無いね
どうすべきかとなると宗教論争になりそうだ
- 89 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:37:25 ]
- >>86
C FAQにあるよ
- 90 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:42:03 ]
- つきつめるとCHAR_BITすら意味をなさないからあまり気にするものでもないと思うが
- 91 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:45:13 ]
- >>87
> 「文字数=バイト数」であるから それは数値の一致であって、意味の一致ではない。 あくまでも「1バイト文字」の「文字数」なのだから。 省略してもプログラムは意図した通りに動くが、 プログラムが動けば何だっていいというのは間違い。
- 92 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 15:54:11 ]
- >>91
はあ… >それは数値の一致であって、意味の一致ではない。 意味の一致だってばさ。頭悪いなあ。 「規格では、strlen() はバイト数を戻す」 これで納得した?
- 93 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:06:54 ]
- charやstrlenをハードコーディングしちゃうなら*sizeof(char)を書く意味はほとんど無いと思うなぁ。
>>87 new使ったってその危険はdeleteとdelete[]を間違える危険にかわるだけじゃね?
- 94 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:10:40 ]
- なんつーか
みんな暇なの?
- 95 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:11:19 ]
- 規格では、strlen() はバイト数と等しい値を返す
だろ?
- 96 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:25:08 ]
- strlenの返す値の意味がバイト数ではなく文字数だと言いたいんですかね。
- 97 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:43:09 ]
- そんなに不安ならコメント書いとこうぜ
- 98 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:46:35 ]
- >>96
格納するのに必要なバイト数 ではないのは確かだな。
- 99 名前:デフォルトの名無しさん [2007/08/20(月) 17:09:30 ]
- >>1
アルファベット=レターと非アルファベット記号=キャラクターとストリングの意味からして、strlenが間違い。
- 100 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:39:16 ]
- 外人は文字が2バイトかもしれないなんて考えてないから、
strlenという関数名なんだろ。
- 101 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:50:26 ]
- >>94
意味のない議論をしたがる厨房が集まってるだけだろ
- 102 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:54:08 ]
- このスレ、すんごい伸びだな。
- 103 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:01:54 ]
- >>84
整数型の暗黙の変換ルールがあるから問題ない。 ただ、size_tは符号無しだから、 intに変換されることで情報が失われるかも分からんね。
- 104 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:05:52 ]
- >>100同感
2バイトあれば全世界の文字が収まると勘違いしていたしな。
- 105 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:14:57 ]
- してません
- 106 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:22:55 ]
- このさい8バイトでいいだろ。
- 107 名前:デフォルトの名無しさん [2007/08/20(月) 18:23:09 ]
- >>100
記号一つに2バイトなんて無意味だし不可能。 strlenが誕生した時代は数バイトのメモリが数万円。
- 108 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:30:18 ]
- んなわけないだろ
- 109 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:36:58 ]
- そんなにsizeof書きたくないんだったら高級言語つかえよ
- 110 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:40:09 ]
- なんじゃそりゃ
- 111 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:42:46 ]
- そんなにsizeof書きたいんだったら高級言語使うなよ
- 112 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:44:08 ]
- >>108
PDP-11は、メモリ64KB程度搭載で、1万ドルくらいだったそうだな。 当時の為替レートからすると、360万円か。 数バイト数万円は違うが、数Kバイト数万円くらいだな。
- 113 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:44:38 ]
- >>111
C言語は高級言語ではないな。
- 114 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:52:11 ]
- >>112
メモリのコストはその一部でしょう
- 115 名前:デフォルトの名無しさん [2007/08/20(月) 18:53:46 ]
- >>1
#defineで定義しておけ。
- 116 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:54:59 ]
- >>114
昔のコンピュータは、メモリのコストは一部なんてもんじゃなく、かなりを占めていたのよ。
- 117 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:56:14 ]
- MSXの32KB増設RAMカートリッジが1万円以上だったのを
思い出したような
- 118 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:58:40 ]
- Cができたのってやっとシリコンメモリが普及し始めたころだっけ?
- 119 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:03:27 ]
- >>84
キャストするべき。 size_tがintと同じサイズである保証は全くない。 sizeof(int) == sizeof(long)の環境に限定するなら、省略するのもありかも試練が。
- 120 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:25:26 ]
- C FAQを見てはいけないスレはここですか?
- 121 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:32:08 ]
- >>118
PDP-11の頃 >>120 C FAQは聖典ですか?
- 122 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:40:30 ]
- 聖典w
- 123 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 20:38:51 ]
- >>121
>C FAQは聖典ですか? いいえ、常識です。
- 124 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 20:43:43 ]
- >>100
>>107 UTF-16とか思い出してあげてください。
- 125 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:07:54 ]
- >>123
C FAQ では、sizeof(char)を使うのは、プログラムがわかりやすくなるから、一興だと言ってるが?
- 126 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:10:14 ]
- >>124
UTF-16は1文字=2バイトじゃねーよ
- 127 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:13:15 ]
- >>125
ぜんぜんいらねーよ。 とも書いているね。まあどっちも正しいってことだな。
- 128 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:15:32 ]
- 書かなかったからといって不正なプログラムというわけではない。
ということだな。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:25:35 ]
- >>126
小学生からやり直せ
- 130 名前:デフォルトの名無しさん [2007/08/20(月) 23:37:29 ]
- >>129
Cにおいてsizeof(char)=1は仕様だが、 1バイトが8ビットなのは仕様ではない。
- 131 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:08:16 ]
- つまんねー内容をだらだらだらだら
何を言い合ってんのおまえら (w
- 132 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:19:55 ]
- ここの人達が、同じプロジェクトに放り込まれたら、
どうなるんだろう... C FAQ は理解しやすくなる「かも」とかいてあるけど、 逆に意図が分からなくて困惑する人もいるかも。
- 133 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:22:53 ]
- 同じプロジェクトに入ったら個人レベルでソースファイルを分割し
他人が担当しているソースファイルは一切見ないようにすればOK。 レビューとかあれば、同じ信念をもち曲げないメンバーでする。 そんなプロジェクトやだなぁw
- 134 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:44:11 ]
- >>130
>>100と>>107がC言語の規格が決まった当時の話をしてるのに、 >>124はもっと最近の話をしてるところが突っ込みどころなわけであって。 ナニコレ。 >UTF-16は1文字=2バイトじゃねーよ >Cにおいてsizeof(char)=1は仕様だが、 >1バイトが8ビットなのは仕様ではない。 誰がUTF-16の1文字=2バイトとか言ってんだ? んー・・・もしやUTF-16は1バイトが8ビットの環境て使うべきでない、 とかそういう意見をお持ちの方?
- 135 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 01:57:32 ]
- >>134
charは文字だろ って話の寄り道だったんじゃないか?
- 136 名前:デフォルトの名無しさん [2007/08/21(火) 07:54:41 ]
- マロック・ストラレン
- 137 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 08:07:00 ]
- 文字の型を隠蔽してsizeof(TCHAR)でいくね
- 138 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 10:44:54 ]
- >>137
C++ のクラスをWin32とWinCEで使いまわす俺には必須だぜ! ところで、>>129 がどこに突っ込んでるのかが知りたい。 UTF-16の1文字は2バイトとは限らないし 2オクテットとも限らないわけだが。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:46:27 ]
- 1バイトのビット数ってこの話にはあんまり関係ないような
- 140 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:57:51 ]
- >>138
根本的にズレてるって意味だろう。 >124 は別にUTF-16が1文字=2バイトだとは言ってないから。
- 141 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:21:34 ]
- >>138
Win32でもUnicodeでやればいいじゃんかー。
- 142 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:33:10 ]
- スレの趣旨がわからなくなってきた
- 143 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:37:16 ]
- 1nibble=4bit
- 144 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:46:42 ]
- 1nibble=4bit
1byte=8bit 1word=16bit 1dword=32bit だっけか 環境とか詳しいことは知らんが
- 145 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:59:30 ]
- 1ワードは36bitだよ。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:12:29 ]
- 1byte=8bitとは限らない。
- 147 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:25:06 ]
- 32ビット256Kワードとかよくある話だな
- 148 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 20:46:59 ]
- >>142
暇つぶし
- 149 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 21:40:25 ]
- 結論。
必ず1だから省略すべし。
- 150 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 21:53:41 ]
- 省略するのは最適化コンパイラの仕事であって人間の仕事ではない。
- 151 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 22:00:31 ]
- コンパイラは省略しません。そういう意味では無駄にコストが発生します。
# 勿論、コンパイルのね。
- 152 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:06:13 ]
- >>151
いや、定数の演算だから消えてなくなるだろ
- 153 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:08:54 ]
- もう、どっちなんですか!!!?
- 154 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:20:24 ]
- >>152
消えてなくなると言うことは、コンパイラは省略せずにちゃんと最適化したということですね。
- 155 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:24:28 ]
- 意味はあっても価値はない。ってところかしら?
価値が無いからと言って、消して良いのか? でも最適化でけされるよ。 消されなかったら実行時のコストだな。 じゃあ、今、消しておこう。
- 156 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:04:18 ]
- 消してしまったsizeof(char)を復元する必要が出てきたときに
莫大なエネルギーが消費されるからそのままにしておいたほうがいいお。 仕事でスパゲッティコードをリファクタリングしたときに、 元のコードをコメントで残しとけとか言われて非常に苦労した覚えがあるお。
- 157 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:13:07 ]
- >元のコードをコメントで残しとけ
リファクタリングもへったくれもありませんな。
- 158 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:23:23 ]
- >>156
>復元する必要が出て来たとき。 上の方で誰か書いてたけど、ラッパー関数にするか、マクロにするかして、 一度に変えられる様にしておけば良い。 復元してもどうせ1だからそのまま使う訳じゃないだろう。
- 159 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 09:47:48 ]
- >>156
>sizeof(char)を復元する必要 Cの仕様が変更にならない限りその必要は無いからな どうだろうな
- 160 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 12:46:00 ]
- subversionでいいじゃん
- 161 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 21:07:24 ]
- …そう言って通る職場なら良いけどな
- 162 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 21:54:59 ]
- svn厨は退場してください
- 163 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:36:22 ]
- じゃあCVSで・・・ごめん、悪かった
- 164 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:51:41 ]
- それならよし!
- 165 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:00:05 ]
- それでいいんかい!
- 166 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 01:40:32 ]
- ふつーbzr
- 167 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 20:54:00 ]
- もうねmallocなんてあちこちで書いてちゃだめなんだよ。
ラッパーとか言うのも違うな。 構造化だよ。オブジェクトを作る段でだけ利用するんだ。 そもそもC++の偉い人がnewなんてすばらしい関数を 用意してくれているんだから、new使えよ。
- 168 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 21:34:07 ]
- Dの偉い人が動的配列なんてすばらしい機能を
用意してくれているんだから、動的配列使えよ。
- 169 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 21:54:16 ]
- vector使うお!!
- 170 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:15:47 ]
- え?newって関数なの?演算子かと思ってたんだが・・・
- 171 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:20:10 ]
- C++のnewは演算子だな。
- 172 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:32:18 ]
- newだって寿命管理はプログラマがやらなきゃいけないわけで、
mallocと同じように、 考えて使うところを狭めないと、 収拾が付かなくなる。
- 173 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:32:33 ]
- ってことはoperator newでオーバーロードできたりするの?
- 174 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:24:37 ]
- >>173
何を今更。だからやろうと思えばOS管理外からメモリを引っ張ってくる事だってできる。
- 175 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:44:33 ]
- smart_ptr<T> ptr = Allocator<T>();
みたいなカスタムアロケータ用意するとか
|

|