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:xvjipUWj396デフォルトの名無しさん
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:AN3bmLPv437デフォルトの名無しさん
2020/03/02(月) 18:52:26.82ID:x4CDu4GY439デフォルトの名無しさん
2020/03/02(月) 19:19:56.44ID:x4CDu4GY お? =ってことでいいのか?
ID変えるとか超しょーもねーねらーだなw
ID変えるとか超しょーもねーねらーだなw
441デフォルトの名無しさん
2020/03/02(月) 19:31:34.34ID:AN3bmLPv >>433
「const 変数を cast してから代入する」というのはそもそも元々禁止事項だから、今回の話とはかなり違う。
「const 変数を cast してから代入する」というのはそもそも元々禁止事項だから、今回の話とはかなり違う。
443デフォルトの名無しさん
2020/03/02(月) 19:39:18.04ID:ael5BwwH444デフォルトの名無しさん
2020/03/02(月) 19:39:59.11ID:AN3bmLPv >>445
>>442 には、以下の用になっている:
// 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
「 11 or 00, depending on platform」
「12340011 or 00115678」
数学的に
A or B
ということは、A または Bに限られると言うことで、それ以外の可能性がないことである。
>>442 には、以下の用になっている:
// 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
「 11 or 00, depending on platform」
「12340011 or 00115678」
数学的に
A or B
ということは、A または Bに限られると言うことで、それ以外の可能性がないことである。
445デフォルトの名無しさん
2020/03/02(月) 19:53:14.29ID:ael5BwwH いや、さすがにそれは「大抵のコンパイラはどちらかに定義する」だから
そうじゃないのも有り得る
ただそんな変な環境まで想定するのも非現実的だし
それを言うなら1byte=8bitsとも限らないんで、そんな環境だとuint8_tもおそらく定義されておらず
はちみつがドヤ顔で自称汎用的だと挙げた>>398も使えないわけだが
そうじゃないのも有り得る
ただそんな変な環境まで想定するのも非現実的だし
それを言うなら1byte=8bitsとも限らないんで、そんな環境だとuint8_tもおそらく定義されておらず
はちみつがドヤ顔で自称汎用的だと挙げた>>398も使えないわけだが
446はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 19:58:23.59ID:4ZdkwDZZ447はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 20:14:13.91ID:4ZdkwDZZ C++20 では負数は2の補数形式で定義されることになったみたい。
C++ の最新規格に追従しているコンパイラは全部 2 の補数を前提にしてたからもう 1 の補数はええやろみたいな話を聞いた。
そこまで決めるのになんで1バイトの大きさは明記しないんだろ。
1 バイトが 8 ビットじゃないアーキテクチャ (で主要 C++ コンパイラがサポートしている環境) が有るんかね?
C++ の最新規格に追従しているコンパイラは全部 2 の補数を前提にしてたからもう 1 の補数はええやろみたいな話を聞いた。
そこまで決めるのになんで1バイトの大きさは明記しないんだろ。
1 バイトが 8 ビットじゃないアーキテクチャ (で主要 C++ コンパイラがサポートしている環境) が有るんかね?
448はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 20:17:54.52ID:4ZdkwDZZ >>445
十分に汎用的とは言えないけど使えないときはコンパイルエラーになるだろうから比較的マシということで勘弁。
十分に汎用的とは言えないけど使えないときはコンパイルエラーになるだろうから比較的マシということで勘弁。
449デフォルトの名無しさん
2020/03/02(月) 20:24:42.94ID:x4CDu4GY >>440
超しょーもねーねらー認めやがったw
超しょーもねーねらー認めやがったw
450デフォルトの名無しさん
2020/03/02(月) 20:26:39.31ID:LGtCkZFK >>447
signedのwrap aroundは定義された?
signedのwrap aroundは定義された?
451はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 20:37:53.23ID:4ZdkwDZZ452デフォルトの名無しさん
2020/03/02(月) 20:40:00.58ID:x4CDu4GY453デフォルトの名無しさん
2020/03/02(月) 20:41:39.08ID:LGtCkZFK 敗走したのにもどってくんなよ
455蟻人間 ◆T6xkBnTXz7B0
2020/03/02(月) 21:47:32.89ID:j/GXcJfE 【ソフト名】リソーエディタ
【URL】https://github.com/katahiromz/RisohEditor
【説明】リソースデータを編集できるソフト。
これ、VS2012でビルドしたら、バイナリサイズが10MB超えてるだけど、なんとか6MB以内に縮小できないだろうか?
インラインとか関係ある?
【URL】https://github.com/katahiromz/RisohEditor
【説明】リソースデータを編集できるソフト。
これ、VS2012でビルドしたら、バイナリサイズが10MB超えてるだけど、なんとか6MB以内に縮小できないだろうか?
インラインとか関係ある?
456はちみつ餃子 ◆8X2XSCHEME
2020/03/02(月) 22:01:25.31ID:4ZdkwDZZ457蟻人間 ◆T6xkBnTXz7B0
2020/03/02(月) 22:10:19.07ID:JxKPpJ6p >>456
うん。zip圧縮したサイズがだいたい10MB。UPXも試したけど圧縮後のサイズには効果が薄いみたい。インライン関数がデカいのがまずいのかな?
うん。zip圧縮したサイズがだいたい10MB。UPXも試したけど圧縮後のサイズには効果が薄いみたい。インライン関数がデカいのがまずいのかな?
458デフォルトの名無しさん
2020/03/02(月) 22:31:49.40ID:TcdIMkwU >>457
サイズ優先の最適化オプション試してみたら
サイズ優先の最適化オプション試してみたら
459デフォルトの名無しさん
2020/03/02(月) 23:45:22.71ID:4PGofnEL460デフォルトの名無しさん
2020/03/02(月) 23:53:18.90ID:4PGofnEL >>398
それはバイトの概念を直接扱えないような言語でも使えると言えば使えるかもしれないが、敢えてそんなコードを書く必要はない。
「高級アセンブラ」の名が無く。
自分が知らない処理系に誰かがコンパイルすることを想定していて不安が残る場合には、どこかに
テストコードを書いておけばいい。例えば、次のようにする:
uint32_t a = 0x11223344;
uint8_t *ptr = (uint8_t *)&a;
if ( ptr[0] == 0x44 && ptr[1] == 0x33 && ptr[2] == 0x22 && ptr[3] == 0x11 ) {
// リトルエンディアン
}
else if ( ptr[0] == 0x11 && ptr[1] == 0x22 && ptr[2] == 0x33 && ptr[3] == 0x44 ) {
// ビッグエンディアン
}
else {
// エラー
}
それはバイトの概念を直接扱えないような言語でも使えると言えば使えるかもしれないが、敢えてそんなコードを書く必要はない。
「高級アセンブラ」の名が無く。
自分が知らない処理系に誰かがコンパイルすることを想定していて不安が残る場合には、どこかに
テストコードを書いておけばいい。例えば、次のようにする:
uint32_t a = 0x11223344;
uint8_t *ptr = (uint8_t *)&a;
if ( ptr[0] == 0x44 && ptr[1] == 0x33 && ptr[2] == 0x22 && ptr[3] == 0x11 ) {
// リトルエンディアン
}
else if ( ptr[0] == 0x11 && ptr[1] == 0x22 && ptr[2] == 0x33 && ptr[3] == 0x44 ) {
// ビッグエンディアン
}
else {
// エラー
}
461デフォルトの名無しさん
2020/03/03(火) 00:10:54.51ID:alJFGTdC462デフォルトの名無しさん
2020/03/03(火) 01:43:26.11ID:vE1VkH8+ CではOK、C++ではUB
C/C++コンパイラではたまたま動く場合が多いかもしれないけど、UBはUBなんだし回避方法もあるんだからやめとこう
ただこれだけの話なんだけど
何が気に食わないのか「わかりやすいんだ!汎用的なんだ!Cらしいんだ!俺のコンパイラでは動くんだ!この程度のテクニックも知らんのか!」
ってノリでナイーブにUB書きたがる奴が絶えないのはなんでだろうね
一度でもそういうのが引き起こす地獄みたいなバグに付き合わされたら二度とそんなことしないしさせないって思うもんなんだけどね
幸運にも遭遇したことがないのか、全部他人に解決してもらってるいい身分の人なのか
C/C++コンパイラではたまたま動く場合が多いかもしれないけど、UBはUBなんだし回避方法もあるんだからやめとこう
ただこれだけの話なんだけど
何が気に食わないのか「わかりやすいんだ!汎用的なんだ!Cらしいんだ!俺のコンパイラでは動くんだ!この程度のテクニックも知らんのか!」
ってノリでナイーブにUB書きたがる奴が絶えないのはなんでだろうね
一度でもそういうのが引き起こす地獄みたいなバグに付き合わされたら二度とそんなことしないしさせないって思うもんなんだけどね
幸運にも遭遇したことがないのか、全部他人に解決してもらってるいい身分の人なのか
463デフォルトの名無しさん
2020/03/03(火) 02:22:47.77ID:V4J60F8x > やめとこう
何の権利で指図するんだよ
何の権利で指図するんだよ
464デフォルトの名無しさん
2020/03/03(火) 02:40:53.66ID:vE1VkH8+ 「そんなにお酒飲み過ぎると健康に悪いよ、やめとこう?」
「一生酒を飲むなと命令するのか!何の権利で指図するんだ!」
おおめんどくさい
ただのアドバイスを命令や強要や脅迫に感じるのは鬱の初期症状だから気を付けなよ
「一生酒を飲むなと命令するのか!何の権利で指図するんだ!」
おおめんどくさい
ただのアドバイスを命令や強要や脅迫に感じるのは鬱の初期症状だから気を付けなよ
465デフォルトの名無しさん
2020/03/03(火) 03:15:03.15ID:V4J60F8x お節介なやつは人からそう見られてるんだよ
466デフォルトの名無しさん
2020/03/03(火) 03:39:42.34ID:vE1VkH8+ お節介じゃないよ
俺の関係者がここを見てここのバカに勇気付けられてUB書き散らかすようになると俺が困るから言ってるんだよ
俺のためだ
俺の関係者がここを見てここのバカに勇気付けられてUB書き散らかすようになると俺が困るから言ってるんだよ
俺のためだ
467デフォルトの名無しさん
2020/03/03(火) 03:54:38.06ID:V4J60F8x 逆もしかりだ
チームに入ったばかりの新入りが「UBだ! UBだ!」と喚きだし
「おまえならどうする?」に答えられないゴミには諦めてもらうしかない
どうせunion使わないためにポインタのキャストとかだろくっだらねえ
チームに入ったばかりの新入りが「UBだ! UBだ!」と喚きだし
「おまえならどうする?」に答えられないゴミには諦めてもらうしかない
どうせunion使わないためにポインタのキャストとかだろくっだらねえ
468デフォルトの名無しさん
2020/03/03(火) 04:29:39.93ID:vE1VkH8+ 新入りに危険な書き方を指摘されたら「くっだらねえ」と逆ギレした上に
チームで規格を当たって検討もせずに新入りに解決策を丸投げするのか
最低だなお前
チームで規格を当たって検討もせずに新入りに解決策を丸投げするのか
最低だなお前
469はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 05:43:51.35ID:WsWEE8rZ470はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 06:03:20.43ID:WsWEE8rZ ガチで組み込み環境のシビアなやつだとバイナリのテストの方に時間をかけたりするから
逆に言語に無頓着になる場合があるというのは聞いたことは有る。
1998 年頃の自動車制御とか携帯電話とかの話なんで、
コンパイラの規格準拠具合もそれほどあてにできなかった時代の話だけど。
逆に言語に無頓着になる場合があるというのは聞いたことは有る。
1998 年頃の自動車制御とか携帯電話とかの話なんで、
コンパイラの規格準拠具合もそれほどあてにできなかった時代の話だけど。
471デフォルトの名無しさん
2020/03/03(火) 06:14:57.83ID:jgFG2YH5 数年前に触ったdspは1byte32bitだったなー
472はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 06:36:20.05ID:WsWEE8rZ473デフォルトの名無しさん
2020/03/03(火) 06:43:09.65ID:0/2hhSYY >>468
例えばmemcpyの各プラットフォームごとに向けた最適化(の元のソース)はお前がここで言うようなUBだらけだろうし
boostなんかも各プラットフォーム向けに分けて書かれてる部分が多い
そこまでUBを避けてどんなプラットフォームでも動くように、なんてのもYAGNIの一種だと思うけどね
例えばmemcpyの各プラットフォームごとに向けた最適化(の元のソース)はお前がここで言うようなUBだらけだろうし
boostなんかも各プラットフォーム向けに分けて書かれてる部分が多い
そこまでUBを避けてどんなプラットフォームでも動くように、なんてのもYAGNIの一種だと思うけどね
474デフォルトの名無しさん
2020/03/03(火) 06:46:29.83ID:AJx5UoX4 >>470
ガチな組込みって言うか普通の企業なら開発環境も決め打ちで作ってテストする
ガチな組込みって言うか普通の企業なら開発環境も決め打ちで作ってテストする
475デフォルトの名無しさん
2020/03/03(火) 06:53:54.29ID:AJx5UoX4476デフォルトの名無しさん
2020/03/03(火) 07:14:47.35ID:WkxUfZWu え?
477デフォルトの名無しさん
2020/03/03(火) 07:16:59.86ID:KvGr1Z90 なぜuint8_tを使わないの??、、
478デフォルトの名無しさん
2020/03/03(火) 07:19:47.74ID:uPsaHRM9 >>475
え?
え?
479デフォルトの名無しさん
2020/03/03(火) 07:30:20.60ID:0/2hhSYY 2008年に一応はっきり決まったらしいね
ただしC++ではそうと決めてはいないので一応UB
ただしC++ではそうと決めてはいないので一応UB
480デフォルトの名無しさん
2020/03/03(火) 07:33:02.45ID:2njekV5l481はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 07:36:41.10ID:WsWEE8rZ >>473
各プラットフォームに「対応」できてるなら別にいいんじゃね。
union の未定義がどうこう言ってるのは >>365 程度のことに
あえて各プラットフォームの事情を持ち込むのは割に合わない (そのくらい UB の厄介さには重みがある)
って話題だと俺は理解してる。
ターゲットが完全に固定されてたとしてもコンパイラが吐くコードを把握する自信は俺はないし
たぶん >>468 もないし、 >>473 だって出来れば避けて通りたくない?
その上でどうしてもいじらないといけないくらい速度に厳しい場面とかだったら嫌々やるかもしれないけど、
最初からはやらないって程度の話。 早すぎる最適化は諸悪の根源っていうし。
各プラットフォームに「対応」できてるなら別にいいんじゃね。
union の未定義がどうこう言ってるのは >>365 程度のことに
あえて各プラットフォームの事情を持ち込むのは割に合わない (そのくらい UB の厄介さには重みがある)
って話題だと俺は理解してる。
ターゲットが完全に固定されてたとしてもコンパイラが吐くコードを把握する自信は俺はないし
たぶん >>468 もないし、 >>473 だって出来れば避けて通りたくない?
その上でどうしてもいじらないといけないくらい速度に厳しい場面とかだったら嫌々やるかもしれないけど、
最初からはやらないって程度の話。 早すぎる最適化は諸悪の根源っていうし。
482はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 07:38:19.27ID:WsWEE8rZ483デフォルトの名無しさん
2020/03/03(火) 07:45:28.78ID:0/2hhSYY484デフォルトの名無しさん
2020/03/03(火) 07:47:02.82ID:AJx5UoX4485デフォルトの名無しさん
2020/03/03(火) 07:50:44.52ID:0/2hhSYY >>484
自分で調べろ
自分で調べろ
486デフォルトの名無しさん
2020/03/03(火) 08:03:53.36ID:NOkKAnZ5487デフォルトの名無しさん
2020/03/03(火) 08:07:38.96ID:0/2hhSYY お前もたいがい煽ってると思うが
>終わりにしなよ
俺に言うなよ
>終わりにしなよ
俺に言うなよ
488デフォルトの名無しさん
2020/03/03(火) 08:22:51.66ID:AJx5UoX4489デフォルトの名無しさん
2020/03/03(火) 08:23:01.86ID:Pp/8GnxB >>483
> そこまで言うなら今現在存在する環境でunionによるtype punningが出来ない環境を挙げてみろ
↓こういう例は把握してるの? >>405 みたいな理解だとこんなコードもエイリアス有効という話になっちゃいそうで危ないと思う。
https://wandbox.org/permlink/qrUVwDZbNPRnOQyN
#include <stdio.h>
#include <stdint.h>
int f(uint16_t* u16, uint32_t* u32) { *u16 = 0x1111; *u32 = 0x22222222; return *u16 + *u32; }
union U { uint16_t u16; uint32_t u32; };
int main() { union U u; printf("%08x\n", f(&u.u16, &u.u32)); }
出力 (gcc 9.2.0 -O2):
22223333
> そこまで言うなら今現在存在する環境でunionによるtype punningが出来ない環境を挙げてみろ
↓こういう例は把握してるの? >>405 みたいな理解だとこんなコードもエイリアス有効という話になっちゃいそうで危ないと思う。
https://wandbox.org/permlink/qrUVwDZbNPRnOQyN
#include <stdio.h>
#include <stdint.h>
int f(uint16_t* u16, uint32_t* u32) { *u16 = 0x1111; *u32 = 0x22222222; return *u16 + *u32; }
union U { uint16_t u16; uint32_t u32; };
int main() { union U u; printf("%08x\n", f(&u.u16, &u.u32)); }
出力 (gcc 9.2.0 -O2):
22223333
490はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 08:31:00.08ID:WsWEE8rZ491はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 08:45:51.11ID:WsWEE8rZ >>484
- std::uint8_t は cstdint にある。 (C++17 の 21.4.1)
- cstdint は C 標準ライブラリヘッダの stdint.h と同じように全ての型とマクロを定義する (同上)
- C++17 が参照する C の規格とは C11 (ISO/IEC 9899:2011) である (C++17 の 2)
- uintN_t はオプショナルだが 8, 16, 32, 64 については対応する型が存在するなら提供しなければならない (C11 の 7.20.1.1)
- char が 8bit ならば C++ には uint8_t は必ず存在するはずだがオプショナルであると言ってるから 8bit の型がない (char が 8bit ではない) ことは想定内なんだろう
というのが根拠。
- std::uint8_t は cstdint にある。 (C++17 の 21.4.1)
- cstdint は C 標準ライブラリヘッダの stdint.h と同じように全ての型とマクロを定義する (同上)
- C++17 が参照する C の規格とは C11 (ISO/IEC 9899:2011) である (C++17 の 2)
- uintN_t はオプショナルだが 8, 16, 32, 64 については対応する型が存在するなら提供しなければならない (C11 の 7.20.1.1)
- char が 8bit ならば C++ には uint8_t は必ず存在するはずだがオプショナルであると言ってるから 8bit の型がない (char が 8bit ではない) ことは想定内なんだろう
というのが根拠。
492デフォルトの名無しさん
2020/03/03(火) 08:49:11.40ID:87wKGSsV いわゆる「悪魔の証明」ですか。
493デフォルトの名無しさん
2020/03/03(火) 08:50:30.01ID:0/2hhSYY494はちみつ餃子 ◆8X2XSCHEME
2020/03/03(火) 09:13:15.69ID:WsWEE8rZ495デフォルトの名無しさん
2020/03/03(火) 10:05:21.19ID:dPHWJmki■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★3 [ぐれ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- ハゲがレジやってるコンビニって
- 4時だから窓から4回ちんこ出した
- クマどもが冬眠拒否
- さわやかって
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
