[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/16 02:43 / Filesize : 202 KB / Number-of Response : 823
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part95



1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part94
toro.2ch.net/test/read.cgi/tech/1329512856/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.78【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1331894668/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

48 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:00:49.21 ]
シングルトンクラスの利用者は
コンストラクタ・デストラクタを意識しなくていいよね?

49 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:07:08.47 ]
>>47
ああ、お前もお前のデザパタ定義を貫けばいいと思うよ

Design Patterns: Elements of Reusable Object-Oriented Software
>In general, a pattern has four essential elements:

>1. The pattern name is a handle we can use to describe a design problem, its
solutions, and consequences in a word or two. Naming a pattern immediately
increases our design vocabulary. It lets us design at a higher level of
abstraction. Having a vocabulary for patterns lets us talk about them with
our colleagues, in our documentation, and even to ourselves. It makes it
easier to think about designs and to communicate them and their trade-offs
to others. Finding good names has been one of the hardest parts of developing
our catalog.


50 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:07:52.05 ]
常識的な範囲内で美味いことやってくれるはずだから気にしなくて良い。

51 名前:49 mailto:sage [2012/05/09(水) 23:11:59.82 ]
一応ソースってことで
my.safaribooksonline.com/book/software-engineering-and-development/patterns/0201633612/chapter-1-introduction/3

52 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:19:23.92 ]
>>49
そらデザパタカタログに乗ってるものは名前ついてるわなw
一部だけ抜粋するんじゃなく、金だして一度全文読んどけよ

53 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:30:04.50 ]
どうでもよろ

ま、デザインパターンの意図としてはパターンを有限個にしたいということであって>49で正解だが
可算無限濃度の設計の中から残すだけの価値があるパターンがこの先可算無限濃度見いだされる可能性は
>49とて否定できないハズ
なにしろ「洗練されたコード」と言うのと同じで数学的基準があるようでない世界だからな

54 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:45:47.55 ]
「何がパターンで、何がパターンでないかは、人それぞれである。」

55 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:53:26.18 ]
パターン入った!

56 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:56:24.63 ]
シングルトンさえできりゃ他はいらん



57 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:01:07.16 ]
>金だして一度全文読んどけよ
いや、お前が読んどけよ
どうやってあのURLを見つけたと思ってんだよ

>>53
俺は>>44
>まだ名前の無いデザパタも複数有る。
を否定しただけ
カタログにした理由、名前を付けることの意義
何故GoFがパターンに不可欠な4要素の第1項目をpattern nameにしたか、そういった話

あれを「さいきょうの設計かたろぐ」だと思ってる層から
意味不明な信者と、アンチが出てくるんじゃないかね

58 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:02:18.35 ]
>>56
Factory MethodとStateぐらいは知っとこうよ

59 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:06:38.78 ]
>>48
しなくていいけど
むしろシングルトンであることを意識しないで済む方がいいと思う
後でシングルトン(プロセス毎)からスレッドローカル(スレッド毎)に変える場合も楽

60 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:08:57.21 ]
スレッドってどういうところに使ってるの?

61 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:14:22.10 ]
>>58
んなもん聞いたことないわ

62 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:19:12.98 ]
>>60
forkが使えない環境のときとか
GUIで重い処理中にキャンセルボタン出すときとか

63 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:20:49.30 ]
>>60
ついぞ昔ならGUIプログラムの非GUI処理。
特にI/O関係。マルチプロセッサーやマルチコアが
現れてからは、並行処理で使われる事が増えつつ有る。

64 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:22:05.96 ]
>>56
Singletonの方がよっぽど要らんだろうに・・・

65 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:27:55.90 ]
結局はお互いのクラスでデータをやりとりできりゃ何でもできるようになった
シングルトンを知ってすべて解決した

66 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:33:25.78 ]
グローバル変数より幾らかマシってものだしな

俺は実態がシングルトンでも
初期化引数かスレッドローカル経由かインジェクションで
xxxContextとかを渡す方が好み



67 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:41:28.38 ]
>>61
Factory Methodを使うとC#におけるBeginInvokeみたいなことがサッと安全にできる
ていうかFactory Methodでクロージャを生成するのだと考えればマルチスレッド状況をスキーリ安全に扱える

Stateはキーマトリックスの処理ルーチンを書くのに個人的に重宝した

>>56
マルチスレッド状況下で呼ばれるSingletonは奥が深い…




68 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:45:48.49 ]
フィライウェイトとか、ファクトリーとか入出力と組み合わせる事は有るけど、
クラスの外から見て状態を持ち変化があるものには絶対つかわんな
ループ中にどっか別の関数でシングルトンが書き換えられてたらデバッグしづらすぎる


69 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 01:10:58.56 ]
グローバル変数がごく簡単に使える C++ でシングルトンとかマッチポンプすぎる。

70 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 01:14:27.49 ]
グローバル変数を使うのが難しい言語の方が珍しいだろ

71 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 01:26:41.19 ]
別にC++もJavaも変わらないよな
ideone.com/aOWhQ
ideone.com/rPUpT
グローバル変数に直よりかは関数経由でアクセスしたり仮想関数使える方が良いだろう
まぁグローバル変数もシングルトンも使わない方が良いけど

72 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 09:59:09.71 ]
自前クラスはポインタ使わず全部参照でやっていますが、
メソッド関数を呼び出すコードを見て、
「この変数は値を渡しているだけなのか、書き換えられて返ってくるのかどうか」がぱっと見分かりません。
(引数がconstかどうか調べれば判断つきますが、面倒で付けずに済ますこともあるし、呼び出し側のソースを流し読みしてるときに分かりずらい)

書き換えないなら必ずconst、呼び出し側のソース見てるときは、メソッドにマウスカーソル合わせて引数をチェック、
というやり方しかないのでしょうか?

73 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 10:07:28.94 ]
>>72
そういうことにならないように関数名や引数並び、引数に使う変数名をちゃんとつける。
どうやったところで関数宣言を見ないのなら正確に把握というわけにはいかない。

74 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 11:18:37.08 ]
>>72
それを嫌って、書き換える場合はポインタ、書き換えない場合はconst参照、と使い分ける人もいる。
私の場合、関数名にgetなどが含まれていて戻り値のない関数は、一番目の引き数が書き換え対象だ。

75 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 11:57:23.49 ]
bool hoge(){
bool result = false;
/* いろいろ処理*/

// 戻り値の用意
return (ioResult&&sockResult&&time<10);
}

なんて関数をコーディングした場合、
if(hoge())
ではなく、戻り値必要ないので
hoge();
なんて書いた場合は、コンパイラの最適化でvoid版hoge()を作って、returnの行を出力しない、
みたいなことはしてくれるんでしょうか?
普通にbool版hoge()が呼ばれて、普通に関数内全部実行して、戻り値はテンポラリかなにかに入れてすぐ捨てるんでしょうか?

76 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:02:41.77 ]
>>75
return の式に非ローカルな副作用が一切無いのであれば、そういう最適化は可能ではある。
ただしあまり大きな違いにはならなさそうなので、実際に最適化されることは少なくとも現時点では
あまりないだろうと思うし、気にするべきでもないと思う。



77 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:04:56.89 ]
最適化されたコードのレジスタ確認してください

78 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:27:30.80 ]
>>75
そのhoge()が同一翻訳単位内から呼ばれた場合は、インライン展開される場合がある。
そのとき、そのreturn文には副作用がないので省略される可能性は高い。
# 一部のコンパイラでは、同一翻訳単位外からでも最適化されうる。
とは言え、void版のhoge()が用意されるわけではない。

79 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 12:34:37.23 ]
>>75は無理だろ。
hogeがstatic関数とかでコンパイル単位内ローカルなら可能かも知れんが
やってるコンパイラは無いだろう。

80 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:01:08.60 ]
ああそうかインラインなら最適化できるね

81 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:41:32.29 ]
staticじゃなくてもVC++のLTCGとかならやってくれるんじゃね

82 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 13:57:55.02 ]
>>81
確かにそうかも。試してないけど。
最適化技術って進んでるんだね。

83 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 22:33:31.08 ]
Microsoft (R) C/C++ Optimizing Compiler ならDLLに入ってても
インライン展開してくれるし、親クラスにキャストしてるオブジェクトの
仮想関数ですらインライン展開してくれるからな。

84 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:14:48.25 ]
オブジェクトファイルかなんかと勘違いしてんじゃないか

85 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:23:53.10 ]
勘違いってなんの事を言っている?

インライン関数のインポートとエクスポート
msdn.microsoft.com/ja-jp/library/feffc7b5(v=vs.80).aspx

86 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:52:13.14 ]
それはインライン関数をDLLに入れられるって話で
DLL内の関数をインライン展開できるって話じゃないだろ



87 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 23:58:02.23 ]
意味が解らないの?

注意
インポート インライン関数は、DLL のバージョン間で矛盾することがあるので、
インライン関数のインポート時は注意が必要です。インライン関数は、アプリケーション コード内に展開されます。
このため、関数を書き直した場合は、アプリケーション自体をコンパイルし直さないと、
インライン関数は更新されません。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。


88 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:20:06.29 ]
それのどこがDLLの関数をEXE側でインライン展開できると読めるんだ?

89 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:23:33.94 ]
namespaceの別名って、undefみたいに消せないのか?
どうせアセンブリコードに展開したときは、本来の名前空間の
名前になるんだから、不要になったら削除できてもいいだろうに

90 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:26:30.84 ]
>>88
インライン展開しないなら、こんな事わざわざ書く必要ないだろ。
逆に「DLLにインライン関数定義してもインライン展開できません」と書くのが筋だろ。

>インポート インライン関数は、DLL のバージョン間で矛盾することがあるので
>。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。

91 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:38:58.63 ]
インライン関数を定義したヘッダとDLLが矛盾するケースがあるって話なんだが、それ
そもそも、リンク時に使うのはインポートライブラリであってDLLそのものは一切使わない


92 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 00:44:47.35 ]
ヘッダーじゃねぇよ。cppに定義して、__dclspec(export) inline 〜と書いた関数でも取り込まれる。
DLLを参照してるアプリケーションをコンパイルするとき、DLLが参照できればぶっこ抜かれるんだよ。


93 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 03:34:47.68 ]
韓国で貯蓄銀行4行また営業停止
仰天!会長は元偽ソウル大生、中国密航で逮捕
jbpress.ismedia.jp/articles/-/35163



自己資本比率5.6%、実はマイナス16.2%だった

営業処分の直前に漁船で密航を試みた会長の正体

金会長は、未来貯蓄銀行に対する営業停止処分が不可避と見て、かねて準備していた密航ルートを使って中国に逃亡しようとした。
金融委員会は未来貯蓄銀行など4つの貯蓄銀行を営業停止処分とした。
来貯蓄銀行の場合、粉飾決算を重ね、「5.67%」と発表していたBIS基準に基づく自己資本比率が実際はマイナス16.2%であることが明らかになった。
jbpress.ismedia.jp/articles/-/35163

◆貯蓄銀行とは庶民専用の銀行

貯蓄銀行(ちょちくぎんこう)とは、個人の貯蓄を引き受けることを主目的とする金融機関である。
庶民に対して倹約を奨励し貯蓄により生活を安定させるための公益的な金融機関。
ja.wikipedia.org/wiki/%E8%B2%AF%E8%93%84%E9%8A%80%E8%A1%8C

94 名前:デフォルトの名無しさん [2012/05/11(金) 05:33:41.33 ]
struct X {
const int x;
X(istream& is) try: x(read_int(is)) {
catch (何か) ...
}
const int read_int(istream& is) const {
int x;
is>>x;
if (x<0) throw 何か;
return x; }
};

int main()
{
X a(cin);//負の数が与えられるまで読み続ける
}

みたいなことってできませんか?

95 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:21:28.72 ]
X(istream& is) {
int x;
for (;;) {
is >> x;
if (!cin) {
cin.clear();
cin.ignore( 1024, '\n' );
continue;
}
if (x < 0);
return ;
}
};

96 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:30:32.40 ]
>>94
何がしたいの?



97 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 06:50:37.13 ]
>>94
のポイントは、
- constメンバを初期化子を使って初期化していること
- tryブロックをそこにかまして、例外処理にしていること
です。
無論、95みたく普通にやればいいのだが。

98 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:11:41.62 ]
>>95
はread_intね。いけてる気がする。

99 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:19:17.27 ]
try {
cin >> x;
} catch (...) {
入力を求める
}
みたいなことを初期化子についてやりたかった。

100 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:33:31.87 ]
int read_int(istream& is) {
try {
int x;
cin >> x;
return x;
}
catch (...) {
return read_int(is);
}
}
みたいな雰囲気。
例外の使い方がよくわからないし、istreamは例外投げないのかな・・・
ひっかかってくれない。

101 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:39:30.34 ]
try {
int x=-1;
cin >> x;
if (x<0) throw x;
return x;
}
catch (int input) {
cerr << input << endl;
read_int(is);
}
でイケた。かっこよくね?

102 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:42:50.74 ]
初心者だからアホーなことしてたら指摘してほしいです。
こんなので大丈夫なのかしら・・・。

103 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 07:44:39.57 ]
status = !status;

これが右に偏ってる気がして気持ち悪いんだけど
どうにかならない?

104 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:19:53.45 ]
うん

105 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:30:41.25 ]
intだと上のでいいのですが、
double x; cin >> x;
の結果がよく分かりません。

stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、
doubleなのでx==0で判定するのも気持ち悪い。
cinが例外飛ばしてくれたりしますか?

106 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:36:01.98 ]
飛ばさねーよ



107 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:43:35.84 ]
やっぱif(cin>>x)で判定して、自分で例外飛ばせばいいか。

108 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:51:53.96 ]
ところで95で
cin.ignore(1024,'\n');
としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね?
決め打ちを避けたいだけなんだけど。

109 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 08:56:45.82 ]
>>105
std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。
cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。

110 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:03:59.04 ]
>>109
へぇ、そんなのがあるんですね。
JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。

>>108
numeric_limits<streamsize>::max()
を第一引数に渡すのはやりすぎでしょうか?

111 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 09:20:10.07 ]
>>107
C++設計者の例。
www2.research.att.com/~bs/bs_faq2.html
の↓あたり。
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error¥n";
return 1; // error return
}


112 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:08:35.52 ]
音声ファイルのパスSoundPathを受け取り、StartSampleからEndSampleまでの標本の値を調べ、
その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。
mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか?

int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){
FILE* fp;
errno_t err;
short int LVol=0,RVol=0;
int Ave=0;
LONGLONG Sum=0;
if((err=fopen_s(&fp,SoundPath,"rb"))!=0){
return 0;
}
fseek(fp,44+StartSample*4,SEEK_SET);
for(int i=0;i<EndSample-StartSample;i++){
fread(&LVol,sizeof(LVol),1,fp);
fread(&RVol,sizeof(RVol),1,fp);
Sum+=MAX(abs(LVol),abs(RVol));
}
if(EndSample-StartSample>0){
Ave=(int)(Sum/(EndSample-StartSample));
}
fclose(fp);
return Ave;
}

113 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 11:34:52.67 ]
前もってユーザが自分でwavに変換するようマニュアルに書いておく

114 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:48:55.12 ]
ま、ファイルから直接〜じゃなくて、一旦展開してから同じように調べるとかでいいんじゃね?

115 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:49:55.94 ]
適当なフリーの変換ツールでも呼べばいいんじゃね?

116 名前:デフォルトの名無しさん [2012/05/13(日) 09:05:43.48 ]
class X {
int a,b;
inline int f() { return a+b; }
int g() { return a+b; }
int h();
inline friend int plus(X& x) { return x.a+x.b; }
};
inline int X::h() { return a+b; }

hの定義につけたインライン要請は意味があると思うのですが、
クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか?
あと同様にクラス内に書いたfriendについてもお願いします。



117 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 09:11:11.31 ]
inline int X::h()これ以外全部意味がない

118 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 10:13:52.49 ]
クラス定義内でメンバ関数・friend関数の定義を書いた場合、暗黙的にinlineがついてるものとみなされる

119 名前:デフォルトの名無しさん [2012/05/13(日) 13:42:41.18 ]
Cのライブラリ(たとえばcstdlib)を使う場合に、
グローバルな名前空間を汚染させない方法ってありますか?
namespace X {
#include <cstdlib>
}
はコンパイルエラーになってしまうのですが・・・

120 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:14:33.20 ]
>>119 無い。

121 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:18:36.79 ]
どうせstdlib.hからcstdlibとか名前かえるくらいなら、
namespaceに入れてくれたらいいのに・・・
あるいはstatic includeみたいなのでも。

122 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:19:52.84 ]
cstdlibを使うのなら汚染させないのは無理だと思うけどstd名前空間にも再宣言されているからstdで使う

123 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:29:45.35 ]
>>119
関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る
特定のコンパイル単位においてのみCのヘッダをインクルードし、
そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは
同名のwrapperの方を呼べば良い
(※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ

C++の関数シンボルは引数型とセットでマングルされるので、
仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても
(extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない


124 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:32:35.45 ]
>>121
C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が
何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456

125 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:43:32.30 ]
>>122
なんという無意味な再宣言w
コーディング規約として、そうするか・・・

>>123
負担が線形増大w
けど参考になります。

>>124
ふむふむ、将来的にも予定はない・・・と。

126 名前:122 mailto:sage [2012/05/13(日) 14:51:25.13 ]
>>125
こーやればいけたので報告
やっていいかどうかはわからないので詳しい人お願いします

#include <iostream>
namespace hoge {
#include <cstdlib>
  using::atoi;
}
int main(void)
{
  int a = hoge::atoi("4");
  std::cout << a << std::endl;
  return 0;
}



127 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:53:10.74 ]
結局リンクの段階でどうしても汚染されるので
無駄だよ

128 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 14:54:22.82 ]
汚染を防ぐじゃなくてstdじゃない名前空間で使うことね

129 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:03:15.52 ]
それだけなら別にこれでいいじゃん

#include <cstdlib>
namespace hoge { using ::atoi; }

130 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:07:17.90 ]
>>126
当然アウト。
17.6.2.2 [using.headers] p3
> A translation unit shall include a header only outside of any external declaration or definition, ...

131 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:16:09.34 ]
>>126
GCC4.7でコンパイル通らないよ。

132 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:30:36.18 ]
>>129
あーそうだね、ごめんなさい
>>126は忘れてください

>>130
解説あり

133 名前:デフォルトの名無しさん [2012/05/13(日) 16:00:48.99 ]
PODなら16byteの構造体に
多重継承でオペレータ関数を追加したら、28byteになってしまった。
多重継承にしたのは、他のクラスでも使うからで
アップキャスト等する予定はありません。
これを多重継承ではなくコピペにしたら16byteのままのはずです。
ただ、コピペするとクラスのコードが長くなって、望ましくありません。
サイズを増やさずに、継承のように再利用出来る方法はありませんか?

134 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 16:31:46.26 ]
>>133 C++でおk

135 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 17:08:52.40 ]
>>134 はげどう
>>133 C++でおk
多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、
みたいな質問をされると困惑するから具体例示せ


136 名前:860 [2012/05/13(日) 18:03:56.68 ]
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : public A, public B { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。



137 名前:133 [2012/05/13(日) 18:06:33.52 ]
※↑は間違いです。失礼
---
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

138 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:22:49.23 ]
>>137
codepad.org/Q4fuvcOb
> size of C is 1
> size of D is 1
> size of E is 1

VC++2010EE の最適化が至らないといだけのことだな。

139 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:28:21.41 ]
www.google.co.jp/search?q=msvc+multiple+inheritance+empty+base+class

stackoverflow.com/questions/6119927/empty-base-optimisation-msvc

https://connect.microsoft.com/VisualStudio/feedback/details/100686/empty-member-optimization-not-working-properly
> 終了
> 解決策: 修正しない
...
> 投稿者: Microsoft、投稿日時: 2006/04/11 11:50
> Hi: unfortunately even though this is a bug in the Visual C++ object
> model we are unable to fix it at this time given that fixing it would
> potentially break a lot of existing programs as the sizes of objects
> would change. Hopefully in the future we may be able to address this
> issue but not for the next release of the product.

140 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:32:38.27 ]
俺もその結論に達しました。
クラスは空であってもサイズは1。
ただし継承元が空の場合、最適化で0とすることが出来る。
しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。
残念、こういう結果になるとは。ともかくありがとうございました。

141 名前:デフォルトの名無しさん [2012/05/13(日) 19:18:04.32 ]
int main(int argc, char* argv[]) {
vector<string> arg(argv,argv+argc);//ここまでOKだよね?
int res;
while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) {
}
}
が通らない。
char* const*にconvertできないといって怒られる。
&arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、
static_castで何とかなりますか?

142 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:20:05.07 ]
ちなみに適当で
static_cast<char*>(&arg[0])
とやってもダメ。

143 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:34:20.71 ]
>>141
何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?

144 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:37:58.28 ]
>>126
#include<c〜>でインクルードして
グローバル名前空間に関数が展開されるのは規格違反
MSのクソコンパイラー以外じゃコンパイル出来んぞ

145 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:38:05.27 ]
>>143
stringとvectorでラッパを作ろうと思って。

146 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:43:57.51 ]
わざとヤッてるとしか見えんな



147 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:46:05.79 ]
>>144
>>132

148 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:51:06.88 ]
static_castはダメだけど、
reinterpret_cast<char**>(&arg[0])でイケた。
違いがわからんw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<202KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef