C++相談室 part129 [無断転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ dfcf-HvS5)
2017/01/09(月) 14:49:27.56ID:p96WJVyd0!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part128
http://echo.2ch.net/test/read.cgi/tech/1480172629/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0952片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd4a-qegt)
2017/03/29(水) 23:10:32.67ID:uG+6tdKud0953デフォルトの名無しさん (ワッチョイ 7b59-BXGz)
2017/03/29(水) 23:32:23.28ID:AoD4FYay00954デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 00:08:17.06ID:POGQ4vF/rエラーにしなければならないのにコンパイルを通してしまう特定のコンパイラーのバグ
0955デフォルトの名無しさん (ワッチョイ cf1f-jsM4)
2017/03/30(木) 00:32:16.96ID:gILJOuVy0できるかどうかなら、出来ると言うことに
詳しく聞きたいなら、こちらの方が良いかも
http://echo.2ch.net/test/read.cgi/tech/1414709836/
0956デフォルトの名無しさん (ワッチョイ 53c1-Fkbu)
2017/03/30(木) 01:52:01.18ID:igjKpMzz0func(char* a) と func(char *a)って違う?
0957デフォルトの名無しさん (ワッチョイ b392-8ugA)
2017/03/30(木) 01:53:25.34ID:T78D8oTL0ポインタの位置が違うだけ?一緒だよ
>>955
できるか
そこも見てたんだけどログの流れ遅くてこっちに来てしまった
0958デフォルトの名無しさん (ワッチョイ f37a-QmV0)
2017/03/30(木) 01:58:51.15ID:Qgxuh/pI00959デフォルトの名無しさん (ワッチョイ 53c1-Fkbu)
2017/03/30(木) 02:00:30.85ID:igjKpMzz0同じか
ありがとう
0960デフォルトの名無しさん (ワッチョイ bf3c-agmj)
2017/03/30(木) 02:32:10.51ID:sHIKu4vn0プログラムのローダーがやるんだろう。
http://www.ertl.jp/~takayuki/readings/info/no02.html
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%80
アセンブラプログラミングでよく使う
.BSSという擬似命令は
データセグメントのうち、0で初期化されるものをいう。
https://ja.wikipedia.org/wiki/.bss
非0の場合は実行ファイルに初期化内容が書かれる。
セグメントの情報は実行ファイルに
WindowsだったらPE形式(つまりexe)にセクションとして書かれている。
0初期化領域は、実体の記述はなくサイズだけ書いてあることもある。
コンパイラやリンカによって、セクションの名前は変わるけれども
コードセグメント → .text
データセグメント → .data
読専データ → .rdata
リソース → .rsrc
こういったセクション名を付けるのが慣習となっている。
.bssというセクション名を持ってるPEファイルも結構あるっぽい。
OSがない原始的なコンピュータの場合は、読み取り専用はROMに置くまでだが、0も非0もRAMに置くことになる。
最近のマイコンなら、実行ファイル内に、0を記述しておくか、非0を記述しておくかということで済むはず。なんらかのハードがメモリ空間へロードさせる。
30年位前だったらROMがメモリ配線に直結されるし、容量的に初期値を持ったRAMということ自体がタブーだろうから、コード内に初期値や0初期化の処理を埋め込むことになる。
0961デフォルトの名無しさん (ワッチョイ b392-AsIq)
2017/03/30(木) 03:34:28.25ID:9cHNN/bR0ここはC++スレだぞ
質問の意味理解してない的はずれな長文でロングパス返さなくて良い
0962デフォルトの名無しさん (ワッチョイ 038f-MCV6)
2017/03/30(木) 06:51:34.25ID:kb+hG/9a00963デフォルトの名無しさん (ワッチョイ 83b4-bOuD)
2017/03/30(木) 07:10:52.31ID:GtG5BmiK00964デフォルトの名無しさん (ワッチョイ 7384-+x88)
2017/03/30(木) 08:19:28.37ID:/X8qE6aT0ありゃ、残ってたか。それは盲点だった。
参考になったよありがとう。
0965デフォルトの名無しさん (アウアウオー Sa1f-mlhd)
2017/03/30(木) 08:40:58.04ID:9khgRv1/aこれは嫌だなー。。本当?
0966デフォルトの名無しさん (ワッチョイ bfcc-hXdu)
2017/03/30(木) 08:50:24.61ID:FvKuiJ0u00967デフォルトの名無しさん (スプッッ Sddf-8ugA)
2017/03/30(木) 11:54:42.41ID:3i58Fh9vd無名名前空間の使い道がさっぱりわからん
0968デフォルトの名無しさん (ワッチョイ a328-ZZMP)
2017/03/30(木) 12:05:24.60ID:QknQ1y490staticと同じ使い道かな
0969デフォルトの名無しさん (ワッチョイ 038f-MCV6)
2017/03/30(木) 12:37:53.22ID:kb+hG/9a01つ1つちまちまstaticをつけて回らなくてもまとめてボンだし
0970デフォルトの名無しさん (スップ Sddf-mnw5)
2017/03/30(木) 12:40:17.76ID:41dNcfyJd名前を考えるという面倒くささなしにメリットを享受できる。
0971デフォルトの名無しさん (ドコグロ MM1f-3MUK)
2017/03/30(木) 13:02:35.48ID:tcaHNIPGM記録的と言うのはこういう奴だろ
http://hanabi.2ch.net/test/read.cgi/i4004/1221375066/491
0972デフォルトの名無しさん (ワッチョイ 038f-MCV6)
2017/03/30(木) 13:40:52.52ID:kb+hG/9a00973デフォルトの名無しさん (ラクッペ MM97-8ugA)
2017/03/30(木) 17:30:29.40ID:K9zcp/soM0974デフォルトの名無しさん (ワッチョイ cf92-KV4R)
2017/03/30(木) 17:36:39.51ID:NvGEhIva00975デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 17:36:40.33ID:oKZnpR9xr0976デフォルトの名無しさん (ササクッテロレ Sp17-EkMZ)
2017/03/30(木) 17:41:14.24ID:uipyTNiYpテンプレート関数
ヘッダと実装の分離
このへん
0977デフォルトの名無しさん (ワッチョイ f37a-QmV0)
2017/03/30(木) 19:08:10.58ID:Qgxuh/pI00978デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 19:50:46.10ID:dELrX4bqrそしてxxx_impl.hをxxx_impl.cppに空目したアホ
0979デフォルトの名無しさん (スッップ Sddf-ahp/)
2017/03/30(木) 20:13:43.42ID:qxGCi119d0980デフォルトの名無しさん (ワッチョイ bf3c-agmj)
2017/03/30(木) 20:33:38.20ID:sHIKu4vn0>>9-14 以降、よく高級言語だけでギャーギャー130レスも盛り上がれたな。
http://qiita.com/nanashi/items/4aff10ab6f9669d006dc
これそっくりのコードで実験した
int hoge(int i) {
int r=0;
if (i >= 0) {
static int ii = static_int(i);
r=ii;
} else {
static int ii = static_int(i);
r=ii;
}
return r;
}
static_int(i)を呼び出すあたりで
MOV DWORD PTR SS:[ESP],a.00406048 ←ガード(ロック)のためのオブジェクト(もちろんコンパイラが吐く暗黙のだろう)への参照を引数にとっている模様
CALL <JMP.&libstdc++-6.__cxa_guard_acquire> → この中には libwinpthread-1の pthread_once、pthread_mutex_lock、pthread_cond_wait、pthread_mutex_unlockなど(>>15)
TEST EAX, EAX
JE なんちゃら (つまりこの分岐でstaticを初期化するかどうか決めている模様)
リリースはこれ
MOV DWORD PTR SS:[ESP],a.00406048
CALL <JMP.&libstdc++-6.__cxa_guard_release>
上記はhoge()内が i と定数比較による単純な正負2分岐であり、呼び出しもhoge(1)などの定数の場合は、hoge()が二つの関数に展開された場合もあった。
hoge()内の i の分岐が定数比較の5分岐(else if)にしてみたら、ガードオブジェクトが個別に5つ作られているように見えた。
結構おもしろね、この結果。
0981デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 20:55:33.59ID:8zS706yR0なんらかのクラスのメンバ関数を他の翻訳単位から見えなくしたいが
明示的に名前つけたnamespaceにしたくないときは要る
staticでは代わりにならない
(他になんかあるっけ;
0982デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 21:03:14.83ID:dELrX4bqr始めて聞く珍妙な説だ
今日はクスリを飲み忘れているとか?
0983デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:21:56.78ID:8zS706yR0a.cppとb.cppに同じ名前のクラスの定義を書いてしまい、さらに同じシグネチャのメンバ関数を書いてしまい、
しかし関数の中身が違うケースを考えると良い
これはリンク時にエラーになるか、杜撰な処理系だとどちらかが適当に呼ばれるという実害があり、
なおかつnamespaceでガードしない限り、ソースコードを弄る誰かが知らずに上のケースを実現してしまう危険性が残る
0984デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:26:32.64ID:8zS706yR0誤: namespaceでガードしない限り
正: 無名namespaceでガードしない限り
名前付きnamespaceだとたまたま同じ名前を使われてしまう危険性が残る、
0985デフォルトの名無しさん (ワッチョイ cf1f-jsM4)
2017/03/30(木) 21:26:49.87ID:gILJOuVy00986デフォルトの名無しさん (ワッチョイ 038f-MCV6)
2017/03/30(木) 21:33:19.96ID:kb+hG/9a0メンバは強制的に外部結合だからなあ
982はシャブじゃなくエトルフィンでも入れてるのかな
0987デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:34:44.32ID:8zS706yR0Visual Studo 2010についてくるVC++とかいうマイナーな処理系
2008もそうだったような…
0988デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:39:33.97ID:8zS706yR0■ "a.cpp"
static foo {
int func(int x, int y) { return x + y; }
};
void call_foo_a() {
foo x;
printf("%s: func(10, 20)=%d\n", __FUNCTION__, x.func(10, 20));
}
■ "b.cpp"
(a.cppと同じだが、foo::func()の中身を return x - y;に変えたやつ)
■ "main.cpp"
extern void call_foo_a();
extern void call_foo_b();
int main() {
call_foo_a(); call_foo_b();
}
0989デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:43:20.63ID:8zS706yR0それはそうかもしれないが、無名namespaceのマングリング規則がトリッキーなのを
>>987は知らないんじゃないの;
いや詳しくは漏れも知らんが、
実際>>988のコードは"a.cpp"と"b.cpp"のfooをどっちも無名namespaceで囲えば正しく動く、
(call_foo_a()は30、call_foo_b()は-10となる、
0990デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 21:45:46.29ID:dELrX4bqr>しかし関数の中身が違うケースを考えると良い
なるほど
それはクラスの定義自体が漏れていることが問題なのだが
なぜかメンバ関数の問題と勘違いしてしまったのだな
0991デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 21:49:03.80ID:8zS706yR0何言ってるのかわからんが推測でレスするが、
メンバ関数を含まないクラスや構造体はリンクが必要なシンボルを生成しないから
同名のブツが複数の翻訳単位にあっても全く問題は無い(よってC言語はstaticだけで逝けた
つまりメンバ関数がこの話の本質だとわかっていない>>990のレスは大概だ、
0992デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 22:05:28.61ID:dELrX4bqrなるほど
ODR違反の未定義動作が問題無いと考えてしまうようでは致し方ない。
ちなみにC++にはテンプレートというものが有って
重複定義された型をパラメーターに持つテンプレートのインスタンスが問題を起こすと言うことには気づかなかったらしい
0993デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 22:15:12.42ID:8zS706yR0ていうか話は逆で、>>988のようなケースがあるからODR制約という概念が生まれ、
無名namespaceは>>988のようなケースにおける解決策
(異なるマングリング名で異なる定義を識別するのだからODR制約には抵触しなくなる
ソースは脳内
>重複定義された型をパラメーターに持つテンプレートのインスタンスが問題を起こすと言うことには気づかなかったらしい
そりゃーODR制約違反のソースだとそうなるが、
無名namespaceで修正した>>988のfooでは起き得ない話、
0994デフォルトの名無しさん (オッペケ Sr17-bOuD)
2017/03/30(木) 22:24:43.35ID:dELrX4bqrうーむ、二つ前の本人のレスは
無名namespaceで修正してなくても関数が無ければ全く問題ない
だったと思うのだが、もう忘れたのだろうか
0995デフォルトの名無しさん (ワッチョイ f359-HQfx)
2017/03/30(木) 22:47:57.29ID:8zS706yR0無名namespaceで修正して「いない」>>998はODR違反だった気がするので
今謹んで訂正した、
0996デフォルトの名無しさん (ワッチョイ d372-8ugA)
2017/03/30(木) 23:55:20.49ID:Plkrcx8f0テンプレート関数だからでした。
想定されてたコンパイラのテンプレートの解釈がinclusion-modelってやつで、そのためでした。
ありがとうございました。
0997デフォルトの名無しさん (ワッチョイ efc8-CrJt)
2017/03/31(金) 01:06:57.90ID:ryHYQIXS00998デフォルトの名無しさん (ワッチョイ f37a-QmV0)
2017/03/31(金) 01:09:12.34ID:UkLjKqcm00999デフォルトの名無しさん (ワッチョイ cf36-FVbu)
2017/03/31(金) 01:14:14.24ID:RI1LGJ050LL言語のVMとかブラウザとかもそうだし
1000デフォルトの名無しさん (ワッチョイ cf92-KV4R)
2017/03/31(金) 01:44:24.21ID:zbf3isLY010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
life time: 80日 10時間 54分 58秒
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。