X



C++相談室 part136
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ bf81-LHz9)
垢版 |
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 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
0274デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/17(日) 19:51:08.65ID:JVUiE6fQ0
>>273
数百バイト程度は許容できるんじゃないの。
コンテナに入れるわけでもないし。
0275デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/17(日) 19:53:22.73ID:JVUiE6fQ0
>>268
ないよ。
0276デフォルトの名無しさん
垢版 |
2018/06/17(日) 19:54:46.50
直近のスレを見れば分かるとおり、C++は複雑怪奇魑魅魍魎だから
プログラミング初学者が手を出したらヤケドしかしない
0277デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/17(日) 20:02:30.99ID:GftzeAnS0
勉強でヤケドする分には問題ないし、
むしろ沢山ヤケドして危険を避ける能力を身に着けるしかない。
実務でやったらアウトだが。
0282デフォルトの名無しさん (ブーイモ MM62-hu3a)
垢版 |
2018/06/17(日) 21:52:06.00ID:PyYPwpSkM
スタティックライブラリAが別のスタティックライブラリBのAPIを使っている場合、ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリAだけをリンクして、実行ファイルを作る形式が良いでしょうか。
それともラリブラリA、ライブラリBを別々にリンク、ビルドして実行ファイルを作る形式が良いでしょうか。
0287はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)
垢版 |
2018/06/18(月) 00:02:38.25ID:CYJOSJS20
iostream の替わりになるようなデファクトスタンダードが登場していない以上、
ほどほどに付き合っていくしか仕方がないよ。

C スタイルは普段から使うには抽象度が低くて面倒くさい。
printf は std::string を表示するのにさえいちいち c_str を通さなきゃならんのだからな。
書式指定との整合が型システムで保証されないのも古い設計だし。
処理系の方である程度は特別扱いすることで折り合いがついてるけど、
あらためて考えるとだいぶん不格好だと思う。

コンセプトやら何やらが導入されたらもうちょっとマシな入出力ライブラリが出来たりしないもんかね?
提案くらいは出てたりしない? って思ったけど、こないだ江添っちがTwitterで「無い」って言ってた気がする。
0289273 (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/18(月) 06:12:18.90ID:q6319o4n0
>>274
iostreamは肝心な時に使えない橙武者です。

ログ出力するクラスは歌舞伎の黒衣のような慎ましい存在でなければならないのですが、
iostreamはあたかも歌舞伎の花形役者のようなオレ様的存在感を出すので好ましくありません。

実例をあげるならば障害発生した時に、ログ用途でiostream系を使うことがあり得えます。
cout やその他インスタンスが生成されてスタックを多く使うことになります。
つまり、実運用環境とログ埋込環境でメモリ構成が大きく異なる環境になってしまうことが避けられません。
iostreamはマルチスレッド環境など対話デバッグでは追跡しにくい現象をログ出力するのに適さない、と断言できます。

橙武者、黒衣など語の意味が分からない方は、ご自身でおググり下さい。
0290デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/18(月) 08:25:55.66ID:Tb7Gp3zL0
io_contextで世界が変わる。
0291デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/18(月) 08:29:09.26ID:Tb7Gp3zL0
coutってアクセスするたびに生成するわけじゃないよね?
0292デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/18(月) 08:34:19.02ID:Tb7Gp3zL0
ツリートラバースするのに、再帰使うよりstd::deque使ったスタックのほうが速いな。
0293デフォルトの名無しさん (ブーイモ MMb6-pMQN)
垢版 |
2018/06/18(月) 08:36:26.28ID:h2dlgwUxM
>>291
グローバルオブジェクトとしてずっと存在してる
0296デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/18(月) 11:02:34.48ID:q6319o4n0
「標準出力への書き込みは遅いから」との理由で、メモリ上にログをため込むことは多いかと思います。
iostream系だと stringstreamを使うことになりますがスタックサイズが割と大きくインスタンス生成のたびに時間もかかります。

さらにいえば、MSVCの場合、snprintf()に比べてstringstreamは書き込みに3倍弱時間がかかります。
本来ならば << 演算子はコンパイル時に型が決まるので書き込みが高速なはずなのですが、
MSVCだとstringstreamがsnprintf()に負ける有様ということです。
なお、Linux GCCの場合、snprintf()とstringstreamは書き込み速度の差は少ないようです。
0303デフォルトの名無しさん (ワッチョイ c27c-TqnL)
垢版 |
2018/06/18(月) 21:06:09.32ID:wRZSUlvR0
Cでは代入式はその結果値が左辺値にはならないから v = 1 = 2 みたいな表現は通らない
C++では左辺値になるので通る
0305デフォルトの名無しさん (ワッチョイ 4223-PZZX)
垢版 |
2018/06/18(月) 21:25:53.85ID:xdRdwSco0
昔からこういう==での判定は
if (S_OK == (result = someApi()) {...}
と定数左で書けという作法もあるけど、
流行らないのは見た目が実行順と逆みたいで妙だからかねえ
0310デフォルトの名無しさん (ワッチョイ ad2d-QRh3)
垢版 |
2018/06/19(火) 00:56:21.64ID:jJOU+tvI0
バッドノウハウ……かなぁ…?
定数を左に書く利点は テストより手軽にコンパイルエラーで止められる事だから
個人的には採用してるんだけど

int i = 0;

/* 想定した挙動 */
if ((i = 0) == 0) { printf("%i\n", i); } /* 定数 右: 出力 "0" */
if (0 == (i = 0)) { printf("%i\n", i); } /* 定数 左: 出力 "0" */

/* typo! == -> = */
if ((i = 0) = 0) { printf("%i\n", i); } /* !!! printfが実行されない! (Cでは通らない) */
if (0 = (i = 0)) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

/* () 忘れ */
if ( i = 0 == 0) { printf("%i\n", i); } /* !!! 出力 "1" (== (0 == 0) == true) 想定外! */
if (0 == i = 0 ) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

そもそも1文字の打ち間違いなんて テストコードの記述そのものでもやりかねないし
(「絶対に間違えない!」なんていう人がいたらコードどころか作文も書いたことない奴ですぜ)

まあ使用が推奨/禁止されてるかはチームに従うとして
ぱっと見で意図が解るようにはしておくとよいかと
0312303 (ワッチョイ c27c-TqnL)
垢版 |
2018/06/19(火) 01:34:04.88ID:6qgw6hGx0
すまんかった >>303 は "v = 1 = 2 みたいな" ではなくて "(v = 1) = 2 みたいな"
括弧忘れたら結合順が変わってしまう 訂正
0313デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/19(火) 03:10:51.39ID:WKXXm+ar0
統合開発環境ってEmacsのことだっけ。
0315デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/19(火) 05:50:29.80ID:WKXXm+ar0
単体テスト書くと処理時間出るから、何に時間かかってるのかわかっていいよね。
0316デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/19(火) 05:52:35.58ID:WKXXm+ar0
やはり一番時間がかかるのはIOだから、IO少なくするのが一番よさそう。
std::vectorなんか全体コピーしても余裕の速さだから気にする必要なかったんや。
0321デフォルトの名無しさん (スップ Sd62-Gye4)
垢版 |
2018/06/19(火) 10:45:51.92ID:x0u1iMAyd
世の中いろんなコーディングルールがある

ifの中は副作用のあるコード禁止とか
goto禁止とか
3項演算子禁止とか
1個の関数は○○行以内とか
変数名は○○文字以内とか

実際に業務で書かない人が決めたりするからたちが悪い
0322はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)
垢版 |
2018/06/19(火) 11:00:52.67ID:2U1bfNZa0
if の条件式の中で代入することは勧められない書き方だと思うけど、
「言語仕様に照らして完全に正しいけど間違いやすい書き方」にいちいち警告を出されるとうんざりする。
オプションで強めのチェックにしたときならともかく、デフォルトでだぞ。

かといって個別に警告の有効・無効のオプションを書くのも面倒くさいしなぁ。
0323デフォルトの名無しさん (ブーイモ MM6d-nvpi)
垢版 |
2018/06/19(火) 14:29:42.98ID:mTWnJSOLM
俺も定数との比較なら
if ( 0 == buf )
って定数を左に書くようにしてる
理由は>>310と同じ意図しない代入防止
0324デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/19(火) 15:21:42.83ID:eYArWI+v0
テスト書けば防げるよ。
0325デフォルトの名無しさん
垢版 |
2018/06/19(火) 17:52:06.99
自動的に静的チェックツールかけとけば教えてくれるよ
0326デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/19(火) 18:32:24.93ID:QaAZlBtz0
関数の戻り値を保存した一時変数を使わなかっただけで警告出されるのは地味につらい。かといって警告を抑止するのも悩ましい。
以下のような感じ。

void test()
{
int foo = bar();
return;
}
0336デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/19(火) 20:51:33.23ID:QaAZlBtz0
相談する時は、「なんでそんなところ行ったんだ」などと“そもそも論”を始めて責任所在の確定に情熱を傾ける後ろ向きで生産性ゼロの人に相談することは避けなければならない。
これが私の設問の真意。以下が回答。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ItemTemplates\VC\Windows Store\1041\BasicPage\BasicPage.xaml.cpp:97
(void) sender; // 未使用のパラメーター
0340326 (ワッチョイ 45d2-Bw3Y)
垢版 |
2018/06/19(火) 21:03:09.63ID:QaAZlBtz0
補足すると、マクロ定義によって戻り値が使われなくなることがある場合の警告を想定。
>>336 であげた BasicPage.xaml.cppの事例は厳密には関数の仮引数を使わない場合の警告なので若干違うが、対処法は同じ。

#define OUTPUT(x)

void test()
{
int foo = bar();
OUTPUT(foo);
(void)foo;
return;
}
0342デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)
垢版 |
2018/06/19(火) 21:12:21.11ID:eYArWI+v0
>>339
そのコードにエフェクトがあるならテストできるのではないでしょうか。
0343デフォルトの名無しさん
垢版 |
2018/06/19(火) 21:18:56.08
>>339
そういうのはコンパイル時にWarning出るから本線にマージする前には見つかるでしょ
0348デフォルトの名無しさん (ワッチョイ 4223-PZZX)
垢版 |
2018/06/19(火) 21:42:40.31ID:j1n9w5rn0
>>339
if (buf = 0) { A }

・buf がゼロの時 A が実行されないと実行結果(出力など)が正しい結果にならない場合
・bufが非ゼロでここでゼロにされると以下同文

この2つの場合は結果がおかしいからテストで見つかる。
結果は正しいが見つけにくいリークが発生するとか
ここ間違えても結果は(常にではないが)多くの場合正しい
とかだと静的/動的カバレッジで見るしかないね。
0350デフォルトの名無しさん
垢版 |
2018/06/19(火) 21:50:59.42
非適合コード: a = a + b + c;
適合コード: a = ( a + b ) + c;
0351デフォルトの名無しさん (ワッチョイ 4223-PZZX)
垢版 |
2018/06/19(火) 21:52:07.12ID:j1n9w5rn0
>>349
>演算にカッコを付けろという警告

メンテしてるアプリのソース内のMD5だか sha だかのコード(問題なく動作中)で
「&とシフトの優先順位わかってんのか?括弧つけたら?」の警告が出るが、
&とシフトの優先順位など知る気もないし書き換えるとバグる気しかしないので放置している。
0353デフォルトの名無しさん (ワッチョイ 42eb-m0US)
垢版 |
2018/06/19(火) 23:42:48.11ID:Ac6XacCG0
質問です
std::unique_ptrはデストラクタで保持するリソースの解放処理を行うので、自明なデストラクタを持つことが出来ず、リテラル型になることが出来ないと思うのですが
デフォルトコンストラクタとnullptrを受けるコンストラクタはconstexpr指定されています、このconstexprにはどういう意味があるのでしょうか?
0354デフォルトの名無しさん (スップ Sd62-PZZX)
垢版 |
2018/06/20(水) 00:16:23.94ID:ai7I58Bid
>>353
https://stackoverflow.com/questions/30766103/why-declare-constrexpr-constructors-for-classes-with-non-trivial-destructors-e/30766445#30766445
によれば
constexpr でないコンストラクタよりも先に(恐らくはコンパイル時に静的に)初期化されるので、

例えばグローバル変数
foo apple;
unique_prt<T> orange;

とあるとき
初期化順を気にせず apple のコンストラクターの中で orange を使用することが出来る。
0356デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/21(木) 04:41:53.49ID:G2MjnjmO0
Scopeのついた#defineのような書き方ってないのでしょうか?
たとえば Uart0.baud 115200を変数としてしてじゃなくてDefineで保持しておきたい
場合にScopeを整理しておきたい。
0358デフォルトの名無しさん (アウアウカー Sa93-tQU5)
垢版 |
2018/06/21(木) 08:23:50.96ID:iolQTPDna
>>356
C++では#defineではなくconstを使うと習いました
0360デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/21(木) 08:52:37.07ID:G2MjnjmO0
Constはラムに配置されますからダメですよ。
それからTemplateは型を変数にしたい場合につかえるだけです。Scopeのついた
定数がないとすると、、、、、なんか使いにくいですね。
0364デフォルトの名無しさん (ワッチョイ 1f7f-GwbS)
垢版 |
2018/06/21(木) 10:43:19.88ID:1tnpfBql0
今どきdefine使ってる奴なんていたらクビだわ
0367デフォルトの名無しさん (ブーイモ MM9f-yRyg)
垢版 |
2018/06/21(木) 12:34:10.47ID:Oz+pq3ApM
>>360
組み込み向けとかでROM実行になっていなければ、どちらもRAMに配置されると思うよ。
もしもコンパイル時解決するかどうかということであれば、constでもちゃんとコンパイル時解決されるし、式(含関数)の場合はconstexprキーワードを使えばコンパイル時解決(可能なら)される。
あと、templateは型だけでなく定数も置けるよ。
0368デフォルトの名無しさん (スップ Sd1f-ddCb)
垢版 |
2018/06/21(木) 12:49:18.77ID:m6fyxFJ7d
考えるべきなのは2つ

コードの即値として使われるのか
値がある番地にマッピングされるのか
その都度関数コールで解決するのか



マッピングされる場合、どのセクションにマッピングされるのか
0369デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/21(木) 13:52:00.91ID:Grok3vuS0
const定数は ヘッダーファイルで宣言するだけではダメでソースファイルでconst定数の実体を初期化しなければならないので、defineより使い勝手が悪い面もある。
最新のC/C++だとその辺どうなってんの?
0371デフォルトの名無しさん (ワッチョイ 7f23-WzrY)
垢版 |
2018/06/21(木) 13:59:26.98ID:S4IxNo+10
>>369
メンバ変数でも数値ならソース側に定義要らないから
struct SimpleMath {
const static int pi = 3;
};
でいい

実体がたくさんできるのを苦にしなければ
namespace n {
const static int pi=3;
};
でもいいし
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況