C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part148
https://mevius.5ch.net/test/read.cgi/tech/1580471646/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
C++相談室 part149
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/02/18(火) 06:19:41.54ID:xvjipUWj337デフォルトの名無しさん
2020/02/29(土) 16:37:43.01ID:MKbmJ2zo 要はlistとvectorの違いは何で、なぜ必要かという文脈でいいのかな
listはfor文にi++入れないための単なる糖衣構文だと思うが
基本的に自分は糖衣構文は必要ない派です
listはfor文にi++入れないための単なる糖衣構文だと思うが
基本的に自分は糖衣構文は必要ない派です
338デフォルトの名無しさん
2020/02/29(土) 16:37:52.88ID:VpO1O9GW リンクリスト万能君も老害リストに追加だね
キャッシュヒット率低いし、64bitポインタの無駄もでかいし
メモリ空間異なるところもっていくときに全部作り直しだし
昨今はむしろ使えないデータ構造扱いされること多いから
c/c++を高速化のために使ってるならなおさら
キャッシュヒット率低いし、64bitポインタの無駄もでかいし
メモリ空間異なるところもっていくときに全部作り直しだし
昨今はむしろ使えないデータ構造扱いされること多いから
c/c++を高速化のために使ってるならなおさら
339デフォルトの名無しさん
2020/02/29(土) 16:38:02.22ID:/L84OmpW 長文書いてる人は全員釣り師。
340デフォルトの名無しさん
2020/02/29(土) 16:40:06.91ID:/L84OmpW341デフォルトの名無しさん
2020/02/29(土) 16:45:07.46ID:ZbPwrBbB342デフォルトの名無しさん
2020/02/29(土) 16:47:16.55ID:/L84OmpW343デフォルトの名無しさん
2020/02/29(土) 16:48:55.39ID:ZbPwrBbB >>342
恐らくIQが高いので一般プログラマはついてこれない。
恐らくIQが高いので一般プログラマはついてこれない。
344デフォルトの名無しさん
2020/02/29(土) 16:49:11.83ID:/L84OmpW はいもう釣り堀は終わり。
345デフォルトの名無しさん
2020/02/29(土) 16:55:50.08ID:ZbPwrBbB 高IQの人と一般の人とは話が通じ合わない。
346デフォルトの名無しさん
2020/02/29(土) 17:09:06.31ID:VpO1O9GW はいこのおじいちゃんの毎度の捨て台詞いただきました
347デフォルトの名無しさん
2020/02/29(土) 17:16:14.77ID:usahjc2v > algorithmと極端に相性が悪い。
> listを使う理由はイテレータの安定性のみ。
とか書くような奴もどうかと思うわ
> listを使う理由はイテレータの安定性のみ。
とか書くような奴もどうかと思うわ
348デフォルトの名無しさん
2020/02/29(土) 18:09:51.88ID:VOzt624K 嘘つくやつって特有の変なプライド持ってるよな。
349デフォルトの名無しさん
2020/02/29(土) 19:24:46.81ID:ZbPwrBbB 話者に対してレベルが低過ぎる人には話が嘘か間違いにしか聞こえない。
350デフォルトの名無しさん
2020/02/29(土) 19:55:24.32ID:8sbT/wNa 嘘つきがレベル高いってのは
赤軍派の暴力事件が相次いでいた頃の
共産主義=インテリのステータスだった時代の
今となってはもうみんな気付いている茶番とインテリぶったやつらが
真っ赤な最高学府で安々と洗脳されたバカばっかりだったという
お笑いぐさのやつだね
赤軍派の暴力事件が相次いでいた頃の
共産主義=インテリのステータスだった時代の
今となってはもうみんな気付いている茶番とインテリぶったやつらが
真っ赤な最高学府で安々と洗脳されたバカばっかりだったという
お笑いぐさのやつだね
351デフォルトの名無しさん
2020/02/29(土) 19:57:19.47ID:YiDWuwc+ 動的配列より全面的に優れているって何かのギャグなの?w
352デフォルトの名無しさん
2020/02/29(土) 21:20:16.71ID:GVKyjNMb >>336
Cに慣れた人間がリンクリストを好む傾向があるのは、
動的配列が一段抽象化層を設けないと扱いづらいのに対してリンクリストはCの自然な構文で生のままで扱いやすいからだよ
君自身も君が馬鹿にしている「癖」に縛られているんだ
Cに慣れた人間がリンクリストを好む傾向があるのは、
動的配列が一段抽象化層を設けないと扱いづらいのに対してリンクリストはCの自然な構文で生のままで扱いやすいからだよ
君自身も君が馬鹿にしている「癖」に縛られているんだ
>>349
仮に IQ が存在するとして、 IQ に差があるのならば、IQの低い受け手はIQの高い話し手の発する全情報を解釈するのに困難を感じることは確かにあり得るとは思いますが、
「嘘か間違いにしか聞こえない」というのは、IQの差だけでは説明できないと思います
IQの低い私の体験としては「わからない」とはいつでもよく感じていたりするのですが、それでも「嘘だ」「間違っている」とは普通は考えませんね
仮に IQ が存在するとして、 IQ に差があるのならば、IQの低い受け手はIQの高い話し手の発する全情報を解釈するのに困難を感じることは確かにあり得るとは思いますが、
「嘘か間違いにしか聞こえない」というのは、IQの差だけでは説明できないと思います
IQの低い私の体験としては「わからない」とはいつでもよく感じていたりするのですが、それでも「嘘だ」「間違っている」とは普通は考えませんね
354デフォルトの名無しさん
2020/02/29(土) 22:20:21.84ID:gvjpz0iS リンクリストって今時のCPUにとって非常に性能上扱いづらいものだからねぇ
順繰りにたどっていく場合に先読みがしづらい
実体を指すポインタの配列なら2つ先、3つ先のアドレスまでキャッシュに載っているから、プリフェッチが効いて必要になる頃にはキャッシュにロードされてる感じになる
順繰りにたどっていく場合に先読みがしづらい
実体を指すポインタの配列なら2つ先、3つ先のアドレスまでキャッシュに載っているから、プリフェッチが効いて必要になる頃にはキャッシュにロードされてる感じになる
355デフォルトの名無しさん
2020/02/29(土) 22:36:08.55ID:rCNvcH1c >>345
ここにはお前と話が通じない一般人しかいないから、お前と話ができる人がいるどこかよそに行った方がお互い生産的だと思うぞw
ここにはお前と話が通じない一般人しかいないから、お前と話ができる人がいるどこかよそに行った方がお互い生産的だと思うぞw
356デフォルトの名無しさん
2020/02/29(土) 22:37:49.26ID:+Y3Jyqj/ >>354
デタラメ書かない
デタラメ書かない
357デフォルトの名無しさん
2020/02/29(土) 22:40:10.33ID:tY0zeWw8358デフォルトの名無しさん
2020/02/29(土) 22:51:13.30ID:XJV+/FNl プリフェッチとか色々ごっちゃになってる
断片的な知識で知ったかしようとして失敗してるパターン
断片的な知識で知ったかしようとして失敗してるパターン
359デフォルトの名無しさん
2020/02/29(土) 23:22:00.98ID:gvjpz0iS 要素アドレスが連続した領域に書き込まれている場合は、
コンパイラがループアンローリングして次の要素アドレスロードしてその参照先のプリフェッチ命令挿入することが可能
ってのを場合によっていくつか先まで出来る
リンクリストの場合はこうはいかない
次の要素のロードが終わらないと次の次の要素のアドレスが分からんのだから
コンパイラがループアンローリングして次の要素アドレスロードしてその参照先のプリフェッチ命令挿入することが可能
ってのを場合によっていくつか先まで出来る
リンクリストの場合はこうはいかない
次の要素のロードが終わらないと次の次の要素のアドレスが分からんのだから
360デフォルトの名無しさん
2020/02/29(土) 23:24:07.69ID:gvjpz0iS インテルCPUの場合はプリフェッチ入れなくても投機的にプリフェッチされてたからこそ、例の脆弱性が問題になってた
361デフォルトの名無しさん
2020/03/01(日) 01:43:44.70ID:3018fiZA 実装法を理解できてないために効率よい使い方を間違っている人は遅さをすぐにキャッシュせいにしてしまう。
362デフォルトの名無しさん
2020/03/01(日) 01:49:59.33ID:3018fiZA >>355
まあそうだが、それだとおまえら一般人はいつまでたってもアホなプログラミングしかできないだろうな。
まあそうだが、それだとおまえら一般人はいつまでたってもアホなプログラミングしかできないだろうな。
363デフォルトの名無しさん
2020/03/01(日) 01:55:38.98ID:3018fiZA >>362
俺の人生経験からすると、現実には本当に馬鹿な人にはいくら言っても無駄なようだが。
いくら言っても理解できないし、強く何度も言うと、逆に明らかに絶対やっては駄目なときでもいつもそればっかりやってしまうようになったりする。
なので周りはむしろ困ることになる。
俺の人生経験からすると、現実には本当に馬鹿な人にはいくら言っても無駄なようだが。
いくら言っても理解できないし、強く何度も言うと、逆に明らかに絶対やっては駄目なときでもいつもそればっかりやってしまうようになったりする。
なので周りはむしろ困ることになる。
364デフォルトの名無しさん
2020/03/01(日) 02:04:09.13ID:3018fiZA cppreferenceを含めてネットでは std::vector ばかり使われているのは、大部分のプログラマがポインタを理解できないのでリンクリストも理解出来ておらず、使いこなすことが出来ないためと踏んでいる。
正しく理解できないためにstd::listを使うと悪い使い方しかできないため、彼らの実験の仕方ではいつもstd::vectorより遅くなってしまう。
そのような人には、C++を使ってもC#以上の速度を出すことは困難で、だからこそ一般プログラマとそれ以下の人材しか集めることの出来ない多くのプロジェクトでは C#やJava,Rubyなど簡易言語が好まれて使われるようになっていると予想される。
俺とは住む世界が違うので、このことは推定に過ぎないがな。
正しく理解できないためにstd::listを使うと悪い使い方しかできないため、彼らの実験の仕方ではいつもstd::vectorより遅くなってしまう。
そのような人には、C++を使ってもC#以上の速度を出すことは困難で、だからこそ一般プログラマとそれ以下の人材しか集めることの出来ない多くのプロジェクトでは C#やJava,Rubyなど簡易言語が好まれて使われるようになっていると予想される。
俺とは住む世界が違うので、このことは推定に過ぎないがな。
365デフォルトの名無しさん
2020/03/01(日) 02:29:46.23ID:0F9Oehpq uint64_t の型から unsigned char の型に変換するにはどうすればよいですか?
同じ4バイトなのでどうにかすれば変換できるのではと思っているのですが。
同じ4バイトなのでどうにかすれば変換できるのではと思っているのですが。
366デフォルトの名無しさん
2020/03/01(日) 02:30:41.70ID:0F9Oehpq 間違えました。
unsigned charは4バイト確保すれば同じバイト数になる。ですね。
unsigned charは4バイト確保すれば同じバイト数になる。ですね。
367デフォルトの名無しさん
2020/03/01(日) 03:40:24.38ID:ZtayyY2i そのマシンのエンディアンの通りに格納したんでいいなら
uint64_t a;
unsigned char b[4];
reinterpret_cast<uint64_t &>(b) = a;
uint64_t a;
unsigned char b[4];
reinterpret_cast<uint64_t &>(b) = a;
368デフォルトの名無しさん
2020/03/01(日) 05:10:36.30ID:lOhQr9G7 std::vectorばかり使われる最大の理由は、C言語における配列と互換性を持つ唯一のコンテナだからでしょ。
369デフォルトの名無しさん
2020/03/01(日) 05:48:12.89ID:3N/K+b45 64ビットって4バイトなのか?というつっこみ
370デフォルトの名無しさん
2020/03/01(日) 07:40:13.71ID:ZtayyY2i あ、そういえば・・・w
371デフォルトの名無しさん
2020/03/01(日) 10:25:14.04ID:7BIH7/M6 >>367
それはだめでしょ
それはだめでしょ
372デフォルトの名無しさん
2020/03/01(日) 10:27:14.27ID:0F9Oehpq >>367,369
間違えました。
8バイトだからこうなるんですね。
変換後の中身を確認したらエンディアンも問題なさそうです。
ありがとうございました。
uint64_t a;
unsigned char b[8];
reinterpret_cast<uint64_t &>(b) = a;
間違えました。
8バイトだからこうなるんですね。
変換後の中身を確認したらエンディアンも問題なさそうです。
ありがとうございました。
uint64_t a;
unsigned char b[8];
reinterpret_cast<uint64_t &>(b) = a;
373デフォルトの名無しさん
2020/03/01(日) 11:39:13.66ID:7BIH7/M6374デフォルトの名無しさん
2020/03/01(日) 12:04:58.71ID:0F9Oehpq >>373
ttps://stackoverflow.com/questions/49648033/c-convert-uint64-t-to-unsigned-char-array
上記を参考に下記でやってみたらこれもうまく行っているようです。
こんな感じでしょうか?
uint64_t a;
unsigned char b[8];
memcpy(b, &a, 8);
ttps://stackoverflow.com/questions/49648033/c-convert-uint64-t-to-unsigned-char-array
上記を参考に下記でやってみたらこれもうまく行っているようです。
こんな感じでしょうか?
uint64_t a;
unsigned char b[8];
memcpy(b, &a, 8);
375デフォルトの名無しさん
2020/03/01(日) 12:12:33.01ID:N+yk7N8j >>364
あなたが書いてることのレベルが低過ぎて理解できません。
あなたが書いてることのレベルが低過ぎて理解できません。
376367
2020/03/01(日) 12:13:34.75ID:1R5iR0i4 ああそうか、アラインメントのこと完全に忘れてたすまん
まぁmemcpy, またはunsigned charにアラインメント指定か、もしくはunsigned charごとに代入した方がいいね
動かす環境が限定されてるならreinterpretでもいいけど
まぁmemcpy, またはunsigned charにアラインメント指定か、もしくはunsigned charごとに代入した方がいいね
動かす環境が限定されてるならreinterpretでもいいけど
377デフォルトの名無しさん
2020/03/01(日) 12:18:16.41ID:7BIH7/M6 それでいいよ
ちなみにmemcpyの呼び出しコストは最適化で消えるから気にしなくていいよ
(コンパイラ依存だけど)
ちなみにmemcpyの呼び出しコストは最適化で消えるから気にしなくていいよ
(コンパイラ依存だけど)
378デフォルトの名無しさん
2020/03/01(日) 12:22:08.16ID:0F9Oehpq >>377
ありがとうございます。
ありがとうございます。
379デフォルトの名無しさん
2020/03/01(日) 12:42:53.26ID:0F9Oehpq 追加で質問があります。
http://codepad.org/uN82gnco
この30〜31行目でemplace_back()、back()を使っているのですが
emplace_backを使うときはこうやって使うのであってるのでしょうか?
あと、上記をコンパイルすると下記エラーが出ます。
「エラー: オブジェクト以外がメンバ関数 ‘int Self::xxx(ITEM)’ を呼び出すことは出来ません」
今色々調べているのですが、何が悪くてどのように解決すれば良いかがまだわかりません。
どうすればよいかわかりますでしょうか?
http://codepad.org/uN82gnco
この30〜31行目でemplace_back()、back()を使っているのですが
emplace_backを使うときはこうやって使うのであってるのでしょうか?
あと、上記をコンパイルすると下記エラーが出ます。
「エラー: オブジェクト以外がメンバ関数 ‘int Self::xxx(ITEM)’ を呼び出すことは出来ません」
今色々調べているのですが、何が悪くてどのように解決すれば良いかがまだわかりません。
どうすればよいかわかりますでしょうか?
380デフォルトの名無しさん
2020/03/01(日) 12:44:04.60ID:GdO9iGlh >cppreferenceを含めてネットでは std::vector ばかり使われているのは、大部分のプログラマがポインタを理解できないのでリンクリストも理解出来ておらず、使いこなすことが出来ないためと踏んでいる。
よくこんな頭の悪いこと思いつくよなw
よくこんな頭の悪いこと思いつくよなw
381デフォルトの名無しさん
2020/03/01(日) 12:47:43.45ID:PLnmvtRY How can you be so certain?
382蟻人間 ◆T6xkBnTXz7B0
2020/03/01(日) 13:00:27.97ID:2UJE7A6V Self::xxxをSelfの後に書かないと。
ラムダ内部は別の関数だからthisにはアクセスできない。[&]を使うとか工夫しないと。
ラムダ内部は別の関数だからthisにはアクセスできない。[&]を使うとか工夫しないと。
383デフォルトの名無しさん
2020/03/01(日) 13:19:18.30ID:7BIH7/M6 >>379
emplaceを試したいならまずは余計なものいれずにやるべきだね
struct ITEM {
ITEM(const char* p) : name(p) {}
std::string name;
};
std::vector<ITEM> items;
items.emplace_back("ABCD");
for (auto& item : items) {
printf("FF %s\n", item.name.c_str());
}
emplaceを試したいならまずは余計なものいれずにやるべきだね
struct ITEM {
ITEM(const char* p) : name(p) {}
std::string name;
};
std::vector<ITEM> items;
items.emplace_back("ABCD");
for (auto& item : items) {
printf("FF %s\n", item.name.c_str());
}
384デフォルトの名無しさん
2020/03/01(日) 13:44:18.34ID:0F9Oehpq >>382
"&"を使うということは構造体をポインタ渡しするということでしょうか?
下記でポインタ渡しにしたつもりですが、同じようなメッセージが出ました。
ポインタ渡しのことではないのでしょうか?
http://codepad.org/L0oOc9RF
ほぼ同じエラー →「エラー: オブジェクト以外がメンバ関数 ‘int Self::xxx(ITEM*)’ を呼び出すことは出来ません」
>>383
サンプルありがとうございます。
emplace_back()の時に直接引数に入れることができるんですね。
参考にさせていただきます。
クラス関数に構造体を渡すとエラーになったので、その質問をしたついでにemplace_back()の使い方の質問もさせていただきました。
"&"を使うということは構造体をポインタ渡しするということでしょうか?
下記でポインタ渡しにしたつもりですが、同じようなメッセージが出ました。
ポインタ渡しのことではないのでしょうか?
http://codepad.org/L0oOc9RF
ほぼ同じエラー →「エラー: オブジェクト以外がメンバ関数 ‘int Self::xxx(ITEM*)’ を呼び出すことは出来ません」
>>383
サンプルありがとうございます。
emplace_back()の時に直接引数に入れることができるんですね。
参考にさせていただきます。
クラス関数に構造体を渡すとエラーになったので、その質問をしたついでにemplace_back()の使い方の質問もさせていただきました。
385デフォルトの名無しさん
2020/03/01(日) 13:50:29.27ID:7BIH7/M6 >>384
> emplace_back()の時に直接引数に入れることができるんですね。
それをやりたいからこそのemplaceだよ
無駄を省きたい上級者用って感じだね
まずは自分でITEMを作ってpush_backで追加するのが基本だと思うよ
> emplace_back()の時に直接引数に入れることができるんですね。
それをやりたいからこそのemplaceだよ
無駄を省きたい上級者用って感じだね
まずは自分でITEMを作ってpush_backで追加するのが基本だと思うよ
386デフォルトの名無しさん
2020/03/01(日) 13:52:07.36ID:cF4UfbiQ 違う違う、[](ITEM& item) を[&](ITEM& item)にしろってこと
387デフォルトの名無しさん
2020/03/01(日) 14:10:29.25ID:0F9Oehpq388デフォルトの名無しさん
2020/03/01(日) 14:23:08.70ID:cF4UfbiQ あっと、[&](ITEM& item)より[this](ITEM& item)のほうがよかったか
389デフォルトの名無しさん
2020/03/01(日) 15:44:10.68ID:0F9Oehpq390デフォルトの名無しさん
2020/03/01(日) 16:31:11.59ID:7BIH7/M6391デフォルトの名無しさん
2020/03/01(日) 16:36:04.92ID:0F9Oehpq >>390
すみません。
センスないような気がしますが下記で入れ替えようと思います。
unsigned char temp1[2];
unsigned char temp2[2];
memcpy(temp1, &num, 2);
temp2[0] = temp1[1];
temp2[1] = temp1[0];
すみません。
センスないような気がしますが下記で入れ替えようと思います。
unsigned char temp1[2];
unsigned char temp2[2];
memcpy(temp1, &num, 2);
temp2[0] = temp1[1];
temp2[1] = temp1[0];
392はちみつ餃子 ◆8X2XSCHEME
2020/03/01(日) 17:16:47.98ID:ZpGOlbch393デフォルトの名無しさん
2020/03/01(日) 18:19:09.36ID:JrOSOdLx394デフォルトの名無しさん
2020/03/01(日) 18:30:07.18ID:wjTinnpB C++の初心者質問スレってなかったっけ
395デフォルトの名無しさん
2020/03/01(日) 18:38:25.85ID:3018fiZA >>372
コピーも何も必要なくて、
uint64_t a;
BYTE *ptr = (BYTE *)&a;
ptr[0] : 0 バイト目
ptr[1] : 1 バイト目
・・・
ptr[7] : 7 バイト目
でいける。
コピーも何も必要なくて、
uint64_t a;
BYTE *ptr = (BYTE *)&a;
ptr[0] : 0 バイト目
ptr[1] : 1 バイト目
・・・
ptr[7] : 7 バイト目
でいける。
396デフォルトの名無しさん
2020/03/01(日) 18:41:25.44ID:3018fiZA >>395
さらに、
union UUU {
uint64_t m_u64;
BYTE m_b[8];
};
uint64_t a; // 入力値
UUU u;
u.m_u64 = a;
とすれば、
u.m_b[0] // 0 バイト目
・・・
u.m_b[7] // 7 バイト目
となる。
さらに、
union UUU {
uint64_t m_u64;
BYTE m_b[8];
};
uint64_t a; // 入力値
UUU u;
u.m_u64 = a;
とすれば、
u.m_b[0] // 0 バイト目
・・・
u.m_b[7] // 7 バイト目
となる。
397デフォルトの名無しさん
2020/03/01(日) 19:07:30.68ID:7BIH7/M6398はちみつ餃子 ◆8X2XSCHEME
2020/03/01(日) 21:11:13.32ID:ZpGOlbch 汎用的に作るならこんな感じかな?
#include <type_traits>
template<class T>
typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value, void>::type
integral_to_bytes(T n, std::uint8_t* dest) {
for(std::size_t i=sizeof(n)-1; i<sizeof(n); i--, n/=256) dest[i] = n%256;
}
#include <type_traits>
template<class T>
typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value, void>::type
integral_to_bytes(T n, std::uint8_t* dest) {
for(std::size_t i=sizeof(n)-1; i<sizeof(n); i--, n/=256) dest[i] = n%256;
}
399デフォルトの名無しさん
2020/03/01(日) 21:22:32.67ID:qtVJ0qYe std::array<uint8_t, sizeof(T)>を返す方が親切だぞ
400はちみつ餃子 ◆8X2XSCHEME
2020/03/01(日) 21:50:36.45ID:ZpGOlbch401デフォルトの名無しさん
2020/03/01(日) 22:10:49.73ID:WtPaEung OMP_STACKSIZEが小さいとセグフォるが1Gとか指定してもいいんか?
402デフォルトの名無しさん
2020/03/02(月) 01:26:05.82ID:jXMtMdaQ >>397
UBという証拠は?
UBという証拠は?
403デフォルトの名無しさん
2020/03/02(月) 01:46:27.25ID:jXMtMdaQ404デフォルトの名無しさん
2020/03/02(月) 01:47:31.58ID:jXMtMdaQ >>403
typedef union
{
uint32_t u32RawData;
uint8_t au8DataBuff[4];
} RawData;
uint32_t ChangeEndianness(uint32_t u32Value)
{
RawData uChangeData,uOrginalData;
uOrginalData.u32RawData = u32Value;
//change the value
uChangeData.au8DataBuff[0] = uOrginalData.au8DataBuff[3];
uChangeData.au8DataBuff[1] = uOrginalData.au8DataBuff[2];
uChangeData.au8DataBuff[2] = uOrginalData.au8DataBuff[1];
uChangeData.au8DataBuff[3] = uOrginalData.au8DataBuff[0];
return (uChangeData.u32RawData);
}
typedef union
{
uint32_t u32RawData;
uint8_t au8DataBuff[4];
} RawData;
uint32_t ChangeEndianness(uint32_t u32Value)
{
RawData uChangeData,uOrginalData;
uOrginalData.u32RawData = u32Value;
//change the value
uChangeData.au8DataBuff[0] = uOrginalData.au8DataBuff[3];
uChangeData.au8DataBuff[1] = uOrginalData.au8DataBuff[2];
uChangeData.au8DataBuff[2] = uOrginalData.au8DataBuff[1];
uChangeData.au8DataBuff[3] = uOrginalData.au8DataBuff[0];
return (uChangeData.u32RawData);
}
405デフォルトの名無しさん
2020/03/02(月) 02:13:31.73ID:jXMtMdaQ C/C++では高速化のためCPUのマシン・アーキテクチャをそのまま使う。
マシン・アーキテクチャによって little endian と big endian の違いが有るのでC++言語仕様としては定義されてないが、「but most compilers define」なっている。
これはつまり、littele endian の CPUなら、そのまま little endian での表現がそのまま読みとられ、big endian の CPUなら、そのまま big endian での表現がそのまま読み取られることを意味している。
たとえば、cppreference では、
「reading from n or c is UB but most compilers define it」
となっており、
32BIT値の 0x12345678の場合に、unionで 16BIT 配列の0要素目に0x0011を代入すると、
0x12340011 or 0x00115678
が読み取られるように書いてある。
undefined behaviour であっても、このどちらかに限定されると言うことであろう。
https://en.cppreference.com/w/cpp/language/union
union S
{
std::int32_t n; // occupies 4 bytes
std::uint16_t s[2]; // occupies 4 bytes
std::uint8_t c; // occupies 1 byte
}; // the whole union occupies 4 bytes
int main()
{
S s = {0x12345678}; // initializes the first member, s.n is now the active member
// at this point, reading from s.s or s.c is undefined behavior
std::cout << std::hex << "s.n = " << s.n << '\n';
s.s[0] = 0x0011; // s.s is now the active member
// at this point, reading from n or c is UB but most compilers define it
std::cout << "s.c is now " << +s.c << '\n' // 11 or 00, depending on platform
<< "s.n is now " << s.n << '\n'; // 12340011 or 00115678
}
マシン・アーキテクチャによって little endian と big endian の違いが有るのでC++言語仕様としては定義されてないが、「but most compilers define」なっている。
これはつまり、littele endian の CPUなら、そのまま little endian での表現がそのまま読みとられ、big endian の CPUなら、そのまま big endian での表現がそのまま読み取られることを意味している。
たとえば、cppreference では、
「reading from n or c is UB but most compilers define it」
となっており、
32BIT値の 0x12345678の場合に、unionで 16BIT 配列の0要素目に0x0011を代入すると、
0x12340011 or 0x00115678
が読み取られるように書いてある。
undefined behaviour であっても、このどちらかに限定されると言うことであろう。
https://en.cppreference.com/w/cpp/language/union
union S
{
std::int32_t n; // occupies 4 bytes
std::uint16_t s[2]; // occupies 4 bytes
std::uint8_t c; // occupies 1 byte
}; // the whole union occupies 4 bytes
int main()
{
S s = {0x12345678}; // initializes the first member, s.n is now the active member
// at this point, reading from s.s or s.c is undefined behavior
std::cout << std::hex << "s.n = " << s.n << '\n';
s.s[0] = 0x0011; // s.s is now the active member
// at this point, reading from n or c is UB but most compilers define it
std::cout << "s.c is now " << +s.c << '\n' // 11 or 00, depending on platform
<< "s.n is now " << s.n << '\n'; // 12340011 or 00115678
}
406デフォルトの名無しさん
2020/03/02(月) 04:24:33.89ID:hM5tZRlI 先月ぼくが通った道だけど、結論が全く違ってて興味深い。
407デフォルトの名無しさん
2020/03/02(月) 08:40:39.81ID:vdXXyaaZ UBの恐ろしさを知らない子の結論だね
若いなあ
若いなあ
408デフォルトの名無しさん
2020/03/02(月) 08:56:34.60ID:/NXxliI7 老害なのか子なのかどっちかにしろ
409デフォルトの名無しさん
2020/03/02(月) 09:31:30.94ID:TcdIMkwU >>403
cではOKなんだよ
だからわざわざc++ではって限定したんだから察せよ
cでは定義されてるから多くのコンパイラーはc++でも同様の解釈する
また実際のところ今後ずっとそうだろう(今回のケースに限っては)
でもUBはUB
屁理屈つけて自己正当化しようともそれは変わらない
エンディアンでなくライフタイムの問題でしょ、c++の常識的に
cではOKなんだよ
だからわざわざc++ではって限定したんだから察せよ
cでは定義されてるから多くのコンパイラーはc++でも同様の解釈する
また実際のところ今後ずっとそうだろう(今回のケースに限っては)
でもUBはUB
屁理屈つけて自己正当化しようともそれは変わらない
エンディアンでなくライフタイムの問題でしょ、c++の常識的に
410デフォルトの名無しさん
2020/03/02(月) 09:37:25.38ID:x4CDu4GY くっそしょーもねえ
411はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 10:51:20.25ID:4ZdkwDZZ >>405
ほとんどの場合に大丈夫だろうという見立ては間違ってないと私も思う。
で、大丈夫でなかったときは?
たぶんコンパイルエラーにも警告にもなることなく黙って未定義動作に突入する。
各処理系・環境での挙動が保証されている (検証が済んでいる) なら別に使ってもいいんじゃないのとは思うけど、
union を使ってすごく良くなるというわけでもないので、あえてやることもないんじゃないのとも思う。
少なくとも最初は選択肢から外すなぁ。
ほとんどの場合に大丈夫だろうという見立ては間違ってないと私も思う。
で、大丈夫でなかったときは?
たぶんコンパイルエラーにも警告にもなることなく黙って未定義動作に突入する。
各処理系・環境での挙動が保証されている (検証が済んでいる) なら別に使ってもいいんじゃないのとは思うけど、
union を使ってすごく良くなるというわけでもないので、あえてやることもないんじゃないのとも思う。
少なくとも最初は選択肢から外すなぁ。
412デフォルトの名無しさん
2020/03/02(月) 13:35:46.29ID:kyrXnWYL 本人わかってんだからそんな必死になって噛み付くようなことでもないだろ
だいたいプラットフォーム全く限定せずにC++でソフトが書けるのかと
>>411
>たぶんコンパイルエラーにも警告にもなることなく黙って未定義動作に突入する。
アホか
普段警告レベル下げてるから気付かねーんだよ
だいたいプラットフォーム全く限定せずにC++でソフトが書けるのかと
>>411
>たぶんコンパイルエラーにも警告にもなることなく黙って未定義動作に突入する。
アホか
普段警告レベル下げてるから気付かねーんだよ
413デフォルトの名無しさん
2020/03/02(月) 15:19:49.70ID:AN3bmLPv v
414デフォルトの名無しさん
2020/03/02(月) 15:20:44.34ID:AN3bmLPv415デフォルトの名無しさん
2020/03/02(月) 15:23:49.36ID:AN3bmLPv >>409
little endian と big endian の違いだけで全面的にUBということではないはず。
unionの仕様からいえば、ちゃんと 64BIT 整数をそのままイメージとして投影したものがバイト配列になって取得できるはず。
それがunionの定義なのだから。
sizeof(union型)とsizeof(unionのメンバ)の関係も定義されているので、それ以外の実装は有り得ないはず。
little endian と big endian の違いだけで全面的にUBということではないはず。
unionの仕様からいえば、ちゃんと 64BIT 整数をそのままイメージとして投影したものがバイト配列になって取得できるはず。
それがunionの定義なのだから。
sizeof(union型)とsizeof(unionのメンバ)の関係も定義されているので、それ以外の実装は有り得ないはず。
416デフォルトの名無しさん
2020/03/02(月) 15:28:47.95ID:LGtCkZFK417デフォルトの名無しさん
2020/03/02(月) 15:43:11.75ID:x4CDu4GY private/protectedで隠されているわけでもないPODの
ビット表現に依存するなってのは理に適わない
規格が保証しないなら自己責任というだけの話
そんなんどこにでもいくらでもある
ビット表現に依存するなってのは理に適わない
規格が保証しないなら自己責任というだけの話
そんなんどこにでもいくらでもある
418デフォルトの名無しさん
2020/03/02(月) 16:18:13.98ID:x4CDu4GY test
419デフォルトの名無しさん
2020/03/02(月) 16:23:29.71ID:AN3bmLPv420はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 16:39:58.55ID:4ZdkwDZZ >>415
規格では全面的に UB だよ。
C++11 の 9.5 を確認してみたんだけど、
共用体で保証されているのは
- 直近で入れたのと同じメンバで取りだす場合
- 先頭部分に共通する型を持つ標準レイアウトの型をメンバとして持つ共用体であれば共通部分を使うのはアリ (← 言い回しがややこしくてスマン)
ってことだけで、あくまでも先頭に適合する型が連続する部分に限って許してる。
そんでもってこれは規格の書き方はちょっと違うだけで C でも同じだわ。
規格では全面的に UB だよ。
C++11 の 9.5 を確認してみたんだけど、
共用体で保証されているのは
- 直近で入れたのと同じメンバで取りだす場合
- 先頭部分に共通する型を持つ標準レイアウトの型をメンバとして持つ共用体であれば共通部分を使うのはアリ (← 言い回しがややこしくてスマン)
ってことだけで、あくまでも先頭に適合する型が連続する部分に限って許してる。
そんでもってこれは規格の書き方はちょっと違うだけで C でも同じだわ。
421デフォルトの名無しさん
2020/03/02(月) 16:44:13.99ID:LGtCkZFK422デフォルトの名無しさん
2020/03/02(月) 16:57:58.17ID:N0Zwryo+ コンピュータはチューリングマシンではない!!!
理由 ---- timeGetTime();
マザボの時計は計算不可能的だ、時計を計算できる「アルゴリズム」は存在しない
理由2 multi-thread チューリングマシンはシングルスレッド的だ
理由3 multi-process シングルスレッドで並列計算を真似る
―― つまり、チューリングマシンなる理論自体はそもそも間違っている!
なぜなら単一のチューリングマシンは並列計算を真似ることができる
つまり、チューリングマシン自体は矛盾している!
(たとえば p->Update(); q->Update(); これはシングルスレッドのコードだ、
つまり、単一のチューリングマシンだ、しかし実行時の効果は並列的だ!)
理由 ---- timeGetTime();
マザボの時計は計算不可能的だ、時計を計算できる「アルゴリズム」は存在しない
理由2 multi-thread チューリングマシンはシングルスレッド的だ
理由3 multi-process シングルスレッドで並列計算を真似る
―― つまり、チューリングマシンなる理論自体はそもそも間違っている!
なぜなら単一のチューリングマシンは並列計算を真似ることができる
つまり、チューリングマシン自体は矛盾している!
(たとえば p->Update(); q->Update(); これはシングルスレッドのコードだ、
つまり、単一のチューリングマシンだ、しかし実行時の効果は並列的だ!)
423デフォルトの名無しさん
2020/03/02(月) 17:05:20.01ID:x4CDu4GY char配列とunionにしてバイトアクセスなんて
みんな自己責任でやってるに決まってるだろうが
そこへ、その案件の関係者でない者が頼まれもしないのにしゃしゃり出て
「UBだ」とキリるのが格好いいと思っているのはそいつ自身だけだ
みんな自己責任でやってるに決まってるだろうが
そこへ、その案件の関係者でない者が頼まれもしないのにしゃしゃり出て
「UBだ」とキリるのが格好いいと思っているのはそいつ自身だけだ
424デフォルトの名無しさん
2020/03/02(月) 17:40:48.54ID:/apuYuUB425デフォルトの名無しさん
2020/03/02(月) 17:44:58.26ID:x4CDu4GY ああ、=にしたいわけね
いいよ別に
こっちも証明できねえし
ただ、おまえさんのアドバイスは俺の胸には全く響いていない
その事実が変わらん限り痛くも痒くもない
いいよ別に
こっちも証明できねえし
ただ、おまえさんのアドバイスは俺の胸には全く響いていない
その事実が変わらん限り痛くも痒くもない
426デフォルトの名無しさん
2020/03/02(月) 17:45:42.25ID:AN3bmLPv >>420
しかし、メンバのアラインの問題さえクリアしていれば、union中の2つのメンバの
offset address は 共に0になる。
そして、以下の通りなので、メモリ中の同じアドレスから読み書きすることになるので、C++の仕様に明示されていなくても、m_b[k] の動作は単純に、m_u64のメモリ中のイメージをそのまま先頭から読み書きすることになる。
なので、問題が起きるとすれば m_u64 と m_b のアラインの問題のみだ。
もし、アラインが合わなかった場合には、m_b[k] が k == 0 でも、m_u64 の途中のアドレスから読み出すことになったりする事になる。
しかし、この様な場合に m_u64 と m_b のアラインが合わない処理系は多分、珍しい。
union UUU {
uint64_t m_u64;
BYTE m_b[8];
};
UUU xx;
xx.m_u64 // もうこの段階で、コンパイラ内部では m_u64 が元々 union のメンバであったという情報は消えることになることが C/C++ の仕様では保障されている。。
xx.m_b[k] // もうこの段階で、コンパイラ内部では m_b が元々 union のメンバであったという情報は消えることになることが C/C++ の仕様では保障されている。。
しかし、メンバのアラインの問題さえクリアしていれば、union中の2つのメンバの
offset address は 共に0になる。
そして、以下の通りなので、メモリ中の同じアドレスから読み書きすることになるので、C++の仕様に明示されていなくても、m_b[k] の動作は単純に、m_u64のメモリ中のイメージをそのまま先頭から読み書きすることになる。
なので、問題が起きるとすれば m_u64 と m_b のアラインの問題のみだ。
もし、アラインが合わなかった場合には、m_b[k] が k == 0 でも、m_u64 の途中のアドレスから読み出すことになったりする事になる。
しかし、この様な場合に m_u64 と m_b のアラインが合わない処理系は多分、珍しい。
union UUU {
uint64_t m_u64;
BYTE m_b[8];
};
UUU xx;
xx.m_u64 // もうこの段階で、コンパイラ内部では m_u64 が元々 union のメンバであったという情報は消えることになることが C/C++ の仕様では保障されている。。
xx.m_b[k] // もうこの段階で、コンパイラ内部では m_b が元々 union のメンバであったという情報は消えることになることが C/C++ の仕様では保障されている。。
427デフォルトの名無しさん
2020/03/02(月) 17:47:34.63ID:LGtCkZFK428デフォルトの名無しさん
2020/03/02(月) 17:53:08.73ID:vdXXyaaZ やっぱりUBの怖さ全然わかってない子か
おっしゃる通りオフセットのアドレスはたまたま一緒かもしれないし、規格を読み解けば論理的にそうなるべきであることは導けるのかもしれない
だけどそれが何だというのか?
そのオフセット値から読み取ってくれることや、そもそも読み取り動作をしてくれるとどうして言い切れる?
未定義動作ではコンパイラが何をするのも何をしないのも完全に自由だということをお忘れなく
おっしゃる通りオフセットのアドレスはたまたま一緒かもしれないし、規格を読み解けば論理的にそうなるべきであることは導けるのかもしれない
だけどそれが何だというのか?
そのオフセット値から読み取ってくれることや、そもそも読み取り動作をしてくれるとどうして言い切れる?
未定義動作ではコンパイラが何をするのも何をしないのも完全に自由だということをお忘れなく
429デフォルトの名無しさん
2020/03/02(月) 17:53:41.95ID:AN3bmLPv https://stackoverflow.com/questions/25664848/unions-and-type-punning
4. THE SAFE CASE: unsigned char
The only safe manner of using type punning is with unsigned char or well unsigned char arrays (because we know that members of array objects are strictly contiguous and there is not any padding bytes when their size is computed with sizeof()).
union {
TYPE data;
unsigned char type_punning[sizeof(TYPE)];
} xx;
Since we know that unsigned char is represented in strict binary form, without padding bits, the type punning can be used here to take a look to the binary represention of the member data.
This tool can be used to analyze how values of a given type are represented, in a particular implementation.
I am not able to see another safe and useful application of type punning under the standard specifications.
4. THE SAFE CASE: unsigned char
The only safe manner of using type punning is with unsigned char or well unsigned char arrays (because we know that members of array objects are strictly contiguous and there is not any padding bytes when their size is computed with sizeof()).
union {
TYPE data;
unsigned char type_punning[sizeof(TYPE)];
} xx;
Since we know that unsigned char is represented in strict binary form, without padding bits, the type punning can be used here to take a look to the binary represention of the member data.
This tool can be used to analyze how values of a given type are represented, in a particular implementation.
I am not able to see another safe and useful application of type punning under the standard specifications.
430デフォルトの名無しさん
2020/03/02(月) 17:55:17.52ID:x4CDu4GY431デフォルトの名無しさん
2020/03/02(月) 17:56:57.42ID:vdXXyaaZ432デフォルトの名無しさん
2020/03/02(月) 18:18:40.49ID:LGtCkZFK >>430
何を根拠もなく断言しとんねんこの老害
cppreferenceはっとく
これ基本的に規格に書かれてる文と同じだ
かつこれはcにしか書かれてない
c++のは下にリンクあるから読んどけ
ttps://ja.cppreference.com/w/c/language/union
共用体の内容をアクセスするために使用されるメンバが、値を格納するために最後に使用されたメンバと同じでない場合は、格納された値のオブジェクト表現が新しい型のオブジェクト表現として再解釈されます (型のパンニングと言います)。
何を根拠もなく断言しとんねんこの老害
cppreferenceはっとく
これ基本的に規格に書かれてる文と同じだ
かつこれはcにしか書かれてない
c++のは下にリンクあるから読んどけ
ttps://ja.cppreference.com/w/c/language/union
共用体の内容をアクセスするために使用されるメンバが、値を格納するために最後に使用されたメンバと同じでない場合は、格納された値のオブジェクト表現が新しい型のオブジェクト表現として再解釈されます (型のパンニングと言います)。
433はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 18:26:04.80ID:4ZdkwDZZ >>426
メモリのレイアウトの話だけならそれ以外の選択肢は実質的にないだろってのはわかるよ。
そりゃそうだ。
実質的にそうだってのは今さら言わなくても知ってる。
いまどきの C++ コンパイラは未定義の挙動はどうなってもいいことを前提にした最適化をすることがあるんだよ……。
去年には LLVM が const 変数への代入を削除するってのでニュースになっただろ。
https://developers.srad.jp/story/19/09/27/1626210/
const 変数は変更されない。 それが前提なんだから変更されても知らんってわけ。
今まで緩く対応してたのが厳しくなることだってある。
共用体が使われる場面ってのはメモリのレイアウトを利用したい場合ってのは多いから
現実には急に挙動を変えるなんてことはないと思うけど、
未定義を警戒するのは最適化に対する警戒なんだよ。
メモリのレイアウトの話だけならそれ以外の選択肢は実質的にないだろってのはわかるよ。
そりゃそうだ。
実質的にそうだってのは今さら言わなくても知ってる。
いまどきの C++ コンパイラは未定義の挙動はどうなってもいいことを前提にした最適化をすることがあるんだよ……。
去年には LLVM が const 変数への代入を削除するってのでニュースになっただろ。
https://developers.srad.jp/story/19/09/27/1626210/
const 変数は変更されない。 それが前提なんだから変更されても知らんってわけ。
今まで緩く対応してたのが厳しくなることだってある。
共用体が使われる場面ってのはメモリのレイアウトを利用したい場合ってのは多いから
現実には急に挙動を変えるなんてことはないと思うけど、
未定義を警戒するのは最適化に対する警戒なんだよ。
434デフォルトの名無しさん
2020/03/02(月) 18:29:44.89ID:EH9ZG6fb このスレみててなんとなく餃子くいたくなったからスーパーいったけど
売りきれてたわ
売りきれてたわ
435デフォルトの名無しさん
2020/03/02(月) 18:33:24.10ID:AN3bmLPv436デフォルトの名無しさん
2020/03/02(月) 18:34:36.46ID:AN3bmLPv■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 【大分】佐賀関で大規模火災、170棟以上が延焼中 70代男性1人と連絡取れず [ぐれ★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「クマはなるべく山に返す努力を」「クマと戦争は間違っている」動物保護活動家の主張 棲み分けと学習放獣でクマ被害なくなるのか?★7 [ぐれ★]
- とらせん IPあり
- 巨専】
- こいせん 全レス転載禁止
- 侍ジャパンシリーズ2025「日本vs韓国」その12
- 【DAZN】ワールドカップ欧州予選総合 ★5
- 【ATP】テニス総合実況スレ2025 Part 211【WTA】
- 【悲報】大分市佐賀関の火事、20軒→170軒に延焼🔥 [481941988]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 肴は炙った〰イカでいい〰って歌あるじゃん?
- 自閉症が「んなっしょい」と連呼するお🏡
- 日本人の海外旅行したきのマナーよくなったのはいつから
- へそグリグリ
