トップページ⇒tech
1002コメント408KB

C++相談室 part129 [無断転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ dfcf-HvS5)2017/01/09(月) 14:49:27.56ID:p96WJVyd0
次スレを立てる時は本文の1行目に以下を追加して下さい
!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+6tdKud
酔っぱらいは機械の操作をしてはなりません
0953デフォルトの名無しさん (ワッチョイ 7b59-BXGz)2017/03/29(水) 23:32:23.28ID:AoD4FYay0
型なのか変数なのかまぎらわいし依存名の解決に使う
0954デフォルトの名無しさん (オッペケ Sr17-bOuD)2017/03/30(木) 00:08:17.06ID:POGQ4vF/r
規格のバグではなく「テンプレートの型」などという意味不明な言葉を使う奴のオツムのバグか
エラーにしなければならないのにコンパイルを通してしまう特定のコンパイラーのバグ
0955デフォルトの名無しさん (ワッチョイ cf1f-jsM4)2017/03/30(木) 00:32:16.96ID:gILJOuVy0
>>950
できるかどうかなら、出来ると言うことに
詳しく聞きたいなら、こちらの方が良いかも

http://echo.2ch.net/test/read.cgi/tech/1414709836/
0956デフォルトの名無しさん (ワッチョイ 53c1-Fkbu)2017/03/30(木) 01:52:01.18ID:igjKpMzz0
funcっていう関数があったときに
func(char* a) と func(char *a)って違う?
0957デフォルトの名無しさん (ワッチョイ b392-8ugA)2017/03/30(木) 01:53:25.34ID:T78D8oTL0
>>956
ポインタの位置が違うだけ?一緒だよ

>>955
できるか
そこも見てたんだけどログの流れ遅くてこっちに来てしまった
0958デフォルトの名無しさん (ワッチョイ f37a-QmV0)2017/03/30(木) 01:58:51.15ID:Qgxuh/pI0
ぐぐればわかることを
0959デフォルトの名無しさん (ワッチョイ 53c1-Fkbu)2017/03/30(木) 02:00:30.85ID:igjKpMzz0
>>957
同じか
ありがとう
0960デフォルトの名無しさん (ワッチョイ bf3c-agmj)2017/03/30(木) 02:32:10.51ID:sHIKu4vn0
>>14
プログラムのローダーがやるんだろう。
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
>>960
ここはC++スレだぞ
質問の意味理解してない的はずれな長文でロングパス返さなくて良い
0962デフォルトの名無しさん (ワッチョイ 038f-MCV6)2017/03/30(木) 06:51:34.25ID:kb+hG/9a0
記録的な亀レスだな
0963デフォルトの名無しさん (ワッチョイ 83b4-bOuD)2017/03/30(木) 07:10:52.31ID:GtG5BmiK0
>>955が質問者の日本語を理解出来ていない気がしなくもない
0964デフォルトの名無しさん (ワッチョイ 7384-+x88)2017/03/30(木) 08:19:28.37ID:/X8qE6aT0
>>945
ありゃ、残ってたか。それは盲点だった。
参考になったよありがとう。
0965デフォルトの名無しさん (アウアウオー Sa1f-mlhd)2017/03/30(木) 08:40:58.04ID:9khgRv1/a
https://goo.gl/8by4rX
これは嫌だなー。。本当?
0966デフォルトの名無しさん (ワッチョイ bfcc-hXdu)2017/03/30(木) 08:50:24.61ID:FvKuiJ0u0
どうせまたお肌のスキンケアだろ
0967デフォルトの名無しさん (スプッッ Sddf-8ugA)2017/03/30(木) 11:54:42.41ID:3i58Fh9vd
namespaseで区切るのは良いんだけど
無名名前空間の使い道がさっぱりわからん
0968デフォルトの名無しさん (ワッチョイ a328-ZZMP)2017/03/30(木) 12:05:24.60ID:QknQ1y490
そのソース以外では使わない関数なんかを放り込んでおけばいい
staticと同じ使い道かな
0969デフォルトの名無しさん (ワッチョイ 038f-MCV6)2017/03/30(木) 12:37:53.22ID:kb+hG/9a0
つーか無名名前空間があれば記憶クラスのstaticはいらんだろ
1つ1つちまちまstaticをつけて回らなくてもまとめてボンだし
0970デフォルトの名無しさん (スップ Sddf-mnw5)2017/03/30(木) 12:40:17.76ID:41dNcfyJd
>>967
名前を考えるという面倒くささなしにメリットを享受できる。
0971デフォルトの名無しさん (ドコグロ MM1f-3MUK)2017/03/30(木) 13:02:35.48ID:tcaHNIPGM
>>962
記録的と言うのはこういう奴だろ
http://hanabi.2ch.net/test/read.cgi/i4004/1221375066/491
0972デフォルトの名無しさん (ワッチョイ 038f-MCV6)2017/03/30(木) 13:40:52.52ID:kb+hG/9a0
8年半かw
0973デフォルトの名無しさん (ラクッペ MM97-8ugA)2017/03/30(木) 17:30:29.40ID:K9zcp/soM
xxx.hに定義されたクラスのメンバ関数を、xxx.cppではなくxxx_impl.hというファイルに実装してるソースがあるのですが、これはどういった意図でしょうか?
0974デフォルトの名無しさん (ワッチョイ cf92-KV4R)2017/03/30(木) 17:36:39.51ID:NvGEhIva0
Pimplの実装部分を別ファイルにしたかったんじゃね
0975デフォルトの名無しさん (オッペケ Sr17-bOuD)2017/03/30(木) 17:36:40.33ID:oKZnpR9xr
作った奴に訊けボケ
0976デフォルトの名無しさん (ササクッテロレ Sp17-EkMZ)2017/03/30(木) 17:41:14.24ID:uipyTNiYp
ヘッダで完結させたい
テンプレート関数
ヘッダと実装の分離

このへん
0977デフォルトの名無しさん (ワッチョイ f37a-QmV0)2017/03/30(木) 19:08:10.58ID:Qgxuh/pI0
何が何でもヘッダから実装を追い出したい人がやってるやつ
0978デフォルトの名無しさん (オッペケ 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:qxGCi119d
ヘッダに実装書くとコンパル時間うざくない?
0980デフォルトの名無しさん (ワッチョイ bf3c-agmj)2017/03/30(木) 20:33:38.20ID:sHIKu4vn0
>>961 バカでごめん。
>>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
>>967
なんらかのクラスのメンバ関数を他の翻訳単位から見えなくしたいが
明示的に名前つけたnamespaceにしたくないときは要る
staticでは代わりにならない
(他になんかあるっけ;
0982デフォルトの名無しさん (オッペケ Sr17-bOuD)2017/03/30(木) 21:03:14.83ID:dELrX4bqr
>クラスのメンバ関数を他の翻訳単位から見えなくしたいが明示的に名前つけたnamespaceにしたくないとき

始めて聞く珍妙な説だ
今日はクスリを飲み忘れているとか?
0983デフォルトの名無しさん (ワッチョイ f359-HQfx)2017/03/30(木) 21:21:56.78ID:8zS706yR0
>>982
a.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:gILJOuVy0
杜撰な処理系って具体的には何?
0986デフォルトの名無しさん (ワッチョイ 038f-MCV6)2017/03/30(木) 21:33:19.96ID:kb+hG/9a0
>>981
メンバは強制的に外部結合だからなあ
982はシャブじゃなくエトルフィンでも入れてるのかな
0987デフォルトの名無しさん (ワッチョイ f359-HQfx)2017/03/30(木) 21:34:44.32ID:8zS706yR0
>>985
Visual Studo 2010についてくるVC++とかいうマイナーな処理系
2008もそうだったような…
0988デフォルトの名無しさん (ワッチョイ f359-HQfx)2017/03/30(木) 21:39:33.97ID:8zS706yR0
次のコードで実験でくる。今日実験したら答えはcall_foo_a()もcall_foo_b()も30やったわ;
■ "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
>>987
それはそうかもしれないが、無名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
>>983
>しかし関数の中身が違うケースを考えると良い

なるほど
それはクラスの定義自体が漏れていることが問題なのだが
なぜかメンバ関数の問題と勘違いしてしまったのだな
0991デフォルトの名無しさん (ワッチョイ f359-HQfx)2017/03/30(木) 21:49:03.80ID:8zS706yR0
>>990
何言ってるのかわからんが推測でレスするが、
メンバ関数を含まないクラスや構造体はリンクが必要なシンボルを生成しないから
同名のブツが複数の翻訳単位にあっても全く問題は無い(よって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
>>992
ていうか話は逆で、>>988のようなケースがあるからODR制約という概念が生まれ、
無名namespaceは>>988のようなケースにおける解決策
(異なるマングリング名で異なる定義を識別するのだからODR制約には抵触しなくなる
ソースは脳内

>重複定義された型をパラメーターに持つテンプレートのインスタンスが問題を起こすと言うことには気づかなかったらしい
そりゃーODR制約違反のソースだとそうなるが、
無名namespaceで修正した>>988のfooでは起き得ない話、
0994デフォルトの名無しさん (オッペケ Sr17-bOuD)2017/03/30(木) 22:24:43.35ID:dELrX4bqr
>無名namespaceで修正した>>988のfooでは起き得ない話、

うーむ、二つ前の本人のレスは
無名namespaceで修正してなくても関数が無ければ全く問題ない
だったと思うのだが、もう忘れたのだろうか
0995デフォルトの名無しさん (ワッチョイ f359-HQfx)2017/03/30(木) 22:47:57.29ID:8zS706yR0
おk
無名namespaceで修正して「いない」>>998はODR違反だった気がするので
今謹んで訂正した、
0996デフォルトの名無しさん (ワッチョイ d372-8ugA)2017/03/30(木) 23:55:20.49ID:Plkrcx8f0
>>976
テンプレート関数だからでした。
想定されてたコンパイラのテンプレートの解釈がinclusion-modelってやつで、そのためでした。
ありがとうございました。
0997デフォルトの名無しさん (ワッチョイ efc8-CrJt)2017/03/31(金) 01:06:57.90ID:ryHYQIXS0
こういう糞議論してる間にほかの言語で着々とプロダクトが作られていくわけである。
0998デフォルトの名無しさん (ワッチョイ f37a-QmV0)2017/03/31(金) 01:09:12.34ID:UkLjKqcm0
記述の自由度が高いせいで全貌を知る者がほとんど居ない
0999デフォルトの名無しさん (ワッチョイ cf36-FVbu)2017/03/31(金) 01:14:14.24ID:RI1LGJ050
いや利用者の多いまともなプロダクトはc++で記述されているのが多いだろ。
LL言語のVMとかブラウザとかもそうだし
1000デフォルトの名無しさん (ワッチョイ cf92-KV4R)2017/03/31(金) 01:44:24.21ID:zbf3isLY0
パフォーマンスが重要な製品作る必要あるなら現状C++しか選択肢ないからね
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 80日 10時間 54分 58秒
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。