C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://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++相談室 part145
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2019/09/13(金) 17:13:24.60ID:/ygW08Jq639デフォルトの名無しさん
2019/10/29(火) 01:43:16.61ID:Vnr+WSpj そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー
640蟻人間 ◆T6xkBnTXz7B0
2019/10/29(火) 02:28:13.51ID:OOQqvLIR 変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。
641デフォルトの名無しさん
2019/10/29(火) 02:42:32.11ID:/DWax9vx WriteConsoleW
642デフォルトの名無しさん
2019/10/29(火) 04:01:15.69ID:ymnLB/52643デフォルトの名無しさん
2019/10/29(火) 04:07:41.50ID:ymnLB/52 例えばググって見つけた、こことか
http://www.t-net.ne.jp/~cyfis/win_api/sdk/WideCharToMultiByte.html
wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk
http://www.t-net.ne.jp/~cyfis/win_api/sdk/WideCharToMultiByte.html
wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk
644デフォルトの名無しさん
2019/10/29(火) 04:13:15.89ID:ymnLB/52 ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ
俺はUnicode文字すべてを表示したいだけだぞ
645デフォルトの名無しさん
2019/10/29(火) 04:20:56.50ID:xS90z6YC chcpくらい使えよ
646デフォルトの名無しさん
2019/10/29(火) 04:26:03.90ID:/DWax9vx windowsのコマンドプロンプトはまだ絵文字とかに対応してないよ
647デフォルトの名無しさん
2019/10/29(火) 04:29:31.79ID:YQKoC2Uo648デフォルトの名無しさん
2019/10/29(火) 04:29:44.12ID:YQKoC2Uo お、文字化けしなかったw
649デフォルトの名無しさん
2019/10/29(火) 04:30:10.10ID:YQKoC2Uo ?????
Jane経由だとだめだろうな
Jane経由だとだめだろうな
650デフォルトの名無しさん
2019/10/29(火) 04:31:42.98ID:YQKoC2Uo >>645
chcp 65001にしてもムダだったぞ
chcp 65001にしてもムダだったぞ
651デフォルトの名無しさん
2019/10/29(火) 04:54:41.95ID:pnjVF+Pb コマンドプロンプトよりJaneは早く絵文字に対応しろ
652デフォルトの名無しさん
2019/10/29(火) 05:06:04.44ID:xS90z6YC >>650
それutf8じゃねーか
それutf8じゃねーか
653デフォルトの名無しさん
2019/10/29(火) 05:14:54.35ID:YQKoC2Uo >>652
ぐぐってからいえwww
ぐぐってからいえwww
654デフォルトの名無しさん
2019/10/29(火) 05:19:50.17ID:YQKoC2Uo なんでコードページ932なのに、NSimSunにすると
日本語以外もちゃんと表示できるのかわからない
日本語以外もちゃんと表示できるのかわからない
655デフォルトの名無しさん
2019/10/29(火) 05:26:40.69ID:xS90z6YC wcharがutf8なのか?あほか?
656デフォルトの名無しさん
2019/10/29(火) 05:36:55.26ID:YQKoC2Uo Visual StudioのソースコードのデフォルトはBOM付きUTF8なんだな
657デフォルトの名無しさん
2019/10/29(火) 06:38:53.94ID:d5obkYRE658デフォルトの名無しさん
2019/10/29(火) 12:08:17.89ID:HlsBbRfa 自分の理解と違ってたので教えてください。
class hoge{
hoge(){}
hoge(const hoge& h){}
~hoge(){}
}
hoge func(){
hoge h;
return h;
}
main(){
hoge h = func();
}
この時、引数なしコンストラクタとコピーコンストラクタ、デストラクタが2回呼ばれると理解してたんだけど、実際動かすとコンストラクタとデストラクタが1回づつしか呼ばれない。
理由ってなんですか?
ちなみにgccで、c++03、c++11でも同様の結果でした。
class hoge{
hoge(){}
hoge(const hoge& h){}
~hoge(){}
}
hoge func(){
hoge h;
return h;
}
main(){
hoge h = func();
}
この時、引数なしコンストラクタとコピーコンストラクタ、デストラクタが2回呼ばれると理解してたんだけど、実際動かすとコンストラクタとデストラクタが1回づつしか呼ばれない。
理由ってなんですか?
ちなみにgccで、c++03、c++11でも同様の結果でした。
660デフォルトの名無しさん
2019/10/29(火) 12:10:21.23ID:gvGgQxyJ 最適化で消された
661デフォルトの名無しさん
2019/10/29(火) 12:14:30.49ID:HlsBbRfa662デフォルトの名無しさん
2019/10/29(火) 13:58:53.43ID:cpD/FVFn >>636
node.js
node.js
663はちみつ餃子 ◆8X2XSCHEME
2019/10/29(火) 13:59:57.20ID:0JV7MfqT664デフォルトの名無しさん
2019/10/29(火) 15:55:18.54ID:VnX4qZP9 失礼します。テストです:
ハート:❤
横向きハート:❥
ハート:❤
横向きハート:❥
666デフォルトの名無しさん
2019/10/29(火) 18:43:54.18ID:NclFvQSb667デフォルトの名無しさん
2019/10/29(火) 21:55:11.67ID:daQRKG1l typedef const struct {
int i;
int j;
} X;
X arr[2] = {
{1,3},
{2,4}
};
int main() {
X *ptr = arr;
printf("%d %d %d <- always zero", ptr->i, (ptr+1)->i, (ptr-1)->i);
return 0;
}
グローバル const struct の配列のアドレスを上に行ったら、常に0が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?
int i;
int j;
} X;
X arr[2] = {
{1,3},
{2,4}
};
int main() {
X *ptr = arr;
printf("%d %d %d <- always zero", ptr->i, (ptr+1)->i, (ptr-1)->i);
return 0;
}
グローバル const struct の配列のアドレスを上に行ったら、常に0が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?
668デフォルトの名無しさん
2019/10/29(火) 22:07:48.92ID:VnX4qZP9 >>667
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。
669デフォルトの名無しさん
2019/10/29(火) 23:33:23.00ID:B0gwdLKJ .bssは0初期化されてる
670デフォルトの名無しさん
2019/10/30(水) 04:47:43.23ID:oMdYt0Tq オブジェクトがスタックに作られてるかヒープに作られてるかってどうやって調べるの
具体的にはboostのmulti_arrayがどっちに作られてるか知りたい
具体的にはboostのmulti_arrayがどっちに作られてるか知りたい
671デフォルトの名無しさん
2019/10/30(水) 06:54:34.02ID:2wpdugOW >>668
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。
672デフォルトの名無しさん
2019/10/30(水) 07:31:59.85ID:yREk150+673デフォルトの名無しさん
2019/10/30(水) 09:19:14.69ID:C/RG5q83 >>670
アドレスでも分かるが、それはスタック領域のアドレス範囲をマップファイル
やEXEヘッダなどから読み解かないといけないので、boostのソースを読むのが
一番楽。
もう一つは、
1. auto local変数でint a; printf( "%08X", &a );としたもの
2. global 変数で、int g_b; printf( "%08X", &g_b );としたもの
3.ヒープの先頭アドレスを調べるため、int *p_c = new int[16];
printf( "%08X", p_c );としたもの
で表示されたアドレスと boost の multi_arrayのアドレスとを比較して、
上位アドレスが近いかどうかで判別できる。1,2,3のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。
アドレスでも分かるが、それはスタック領域のアドレス範囲をマップファイル
やEXEヘッダなどから読み解かないといけないので、boostのソースを読むのが
一番楽。
もう一つは、
1. auto local変数でint a; printf( "%08X", &a );としたもの
2. global 変数で、int g_b; printf( "%08X", &g_b );としたもの
3.ヒープの先頭アドレスを調べるため、int *p_c = new int[16];
printf( "%08X", p_c );としたもの
で表示されたアドレスと boost の multi_arrayのアドレスとを比較して、
上位アドレスが近いかどうかで判別できる。1,2,3のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。
674デフォルトの名無しさん
2019/10/30(水) 09:33:17.69ID:scNMtFri どう考えてもヒープだろ
675デフォルトの名無しさん
2019/10/30(水) 09:45:24.54ID:vMK+Q7lg676デフォルトの名無しさん
2019/10/30(水) 11:38:54.67ID:M6J6raPE コンテナの場合はスタックに置いたつもりでも、コンテナがデータ部分を内部でnewするとかそういう話だろ
677はちみつ餃子 ◆8X2XSCHEME
2019/10/30(水) 12:07:14.45ID:qu4eF7c5 >>667-668
仕様上は配列の範囲外を指すポインタを作るのさえも未定義。
たとえアクセスしなくても。
なので、 ptr-1 という式の時点で未定義動作になる。
ただし、アクセスしないなら配列の最後の要素より一個うしろを指すポインタを作るのは許される。
つまりこの例で言えば ptr+2 や &ptr[2] は有りだけど ptr[2] は駄目。
&ptr[2] は ptr[2] に対して & を付けているので一見すると途中で ptr[2] を評価しているように見えるけど、
・ ptr[2] は (*(ptr+2)) の構文糖である
・ * の結果に & を適用している場合には * も & も評価されず、両方とも取り除いたのと同じことになる
というルールの合わせ技によって &ptr[2] は ptr+2 と同じ意味になる。
ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つことは保証される。
仕様上は配列の範囲外を指すポインタを作るのさえも未定義。
たとえアクセスしなくても。
なので、 ptr-1 という式の時点で未定義動作になる。
ただし、アクセスしないなら配列の最後の要素より一個うしろを指すポインタを作るのは許される。
つまりこの例で言えば ptr+2 や &ptr[2] は有りだけど ptr[2] は駄目。
&ptr[2] は ptr[2] に対して & を付けているので一見すると途中で ptr[2] を評価しているように見えるけど、
・ ptr[2] は (*(ptr+2)) の構文糖である
・ * の結果に & を適用している場合には * も & も評価されず、両方とも取り除いたのと同じことになる
というルールの合わせ技によって &ptr[2] は ptr+2 と同じ意味になる。
ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つことは保証される。
678デフォルトの名無しさん
2019/10/30(水) 12:14:10.66ID:pPHw66rS679デフォルトの名無しさん
2019/10/30(水) 12:21:16.92ID:C/RG5q83 >>677
>ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つこと>は保証される。
しかも、TYPE arr[N] の場合、それぞれの要素間隔であるところの
&arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
struct TXxx { BYTE a[3] }; のように中途半端な内容を持っている場合、
標準的には、sizeof(TXxx)は最後のpaddingまで含めた4になる。
その結果、古くからCの仕様書に載っている通り、
&arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
の式が常に厳密に成り立つことが保証される。
>ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つこと>は保証される。
しかも、TYPE arr[N] の場合、それぞれの要素間隔であるところの
&arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
struct TXxx { BYTE a[3] }; のように中途半端な内容を持っている場合、
標準的には、sizeof(TXxx)は最後のpaddingまで含めた4になる。
その結果、古くからCの仕様書に載っている通り、
&arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
の式が常に厳密に成り立つことが保証される。
680デフォルトの名無しさん
2019/10/30(水) 12:25:41.94ID:C/RG5q83 >>678
operator&(), operator*() をユーザーが定義した場合には、それに従うが、
定義しなかった場合、&*pX == pX が どんなポインタ pX についても
成り立つことは保証されるはず。
operator&(), operator*() をユーザーが定義した場合には、それに従うが、
定義しなかった場合、&*pX == pX が どんなポインタ pX についても
成り立つことは保証されるはず。
681デフォルトの名無しさん
2019/10/30(水) 13:28:14.72ID:JDSjHFuf >>670
一般的なPC環境なら、
適当に用意した別の関数を呼び出して(multi_arrayのインスタンスがまだ有効で、インスタンス生成したスレッドと同一スレッドからなら、どこから呼び出してもよい)、
その関数のローカル変数のアドレスよりも&multi_array[0]の値のほうが大きければ、multi_arrayのデータ領域はスタックに確保されたと判断できるのでは
一般的なPC環境なら、
適当に用意した別の関数を呼び出して(multi_arrayのインスタンスがまだ有効で、インスタンス生成したスレッドと同一スレッドからなら、どこから呼び出してもよい)、
その関数のローカル変数のアドレスよりも&multi_array[0]の値のほうが大きければ、multi_arrayのデータ領域はスタックに確保されたと判断できるのでは
682デフォルトの名無しさん
2019/10/30(水) 13:38:23.28ID:C/RG5q83 >>681
自分も最初、同じような勘違いをしていたが、
シングルスレッドの場合に限定すれば、
スタックの構造からすれば、最初に確保したローカル変数のアドレスが、
そのごろのローカル変数のアドレスよりも必ず大きい。
そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
なので、後から別の関数を呼び出す必要はない。
main()関数の中で最初に定義したローカル変数のアドレスが分かればそれで十分。
自分も最初、同じような勘違いをしていたが、
シングルスレッドの場合に限定すれば、
スタックの構造からすれば、最初に確保したローカル変数のアドレスが、
そのごろのローカル変数のアドレスよりも必ず大きい。
そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
なので、後から別の関数を呼び出す必要はない。
main()関数の中で最初に定義したローカル変数のアドレスが分かればそれで十分。
683デフォルトの名無しさん
2019/10/30(水) 13:39:27.23ID:C/RG5q83684デフォルトの名無しさん
2019/10/30(水) 16:43:27.90ID:iACLsVPd 0 埋め勝手に期待してると
Debug build と Release build の変化ではまるんじゃね
Debug build と Release build の変化ではまるんじゃね
685デフォルトの名無しさん
2019/10/30(水) 18:21:24.13ID:sLIKMMS8 未定義動作に頼って幸せになった人間はいない
686デフォルトの名無しさん
2019/10/30(水) 18:25:45.90ID:PFJwOjFS 問題は未定義動作が多すぎることだ
687デフォルトの名無しさん
2019/10/30(水) 19:14:52.52ID:NnKRxbK9688デフォルトの名無しさん
2019/10/30(水) 19:53:22.92ID:/8g3afGg c++なら暗黙に0で初期化するところでcだと死ぬ
689はちみつ餃子 ◆8X2XSCHEME
2019/10/30(水) 20:10:37.29ID:qu4eF7c5 Boehm GC にスタック・ヒープの範囲を判定する部分があったはず。
690デフォルトの名無しさん
2019/10/30(水) 20:42:33.17ID:MNbPntdA >>682
ヒープから確保したアドレスがスタックより大きいっていうのはかなり特殊な環境では?
ヒープから確保したアドレスがスタックより大きいっていうのはかなり特殊な環境では?
691デフォルトの名無しさん
2019/10/30(水) 20:46:40.08ID:7FaQcqiv692デフォルトの名無しさん
2019/10/30(水) 21:02:17.94ID:xN/ut28D お前ら甘いぞ
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな
693デフォルトの名無しさん
2019/10/30(水) 21:28:56.04ID:KWwo/1iW https://ideone.com/Q4ek9R
デストラクタを後から書き換えるってできなかったっけ?
デストラクタを後から書き換えるってできなかったっけ?
694デフォルトの名無しさん
2019/10/30(水) 21:37:47.50ID:scNMtFri なんで出来ると思ったのか
695デフォルトの名無しさん
2019/10/30(水) 21:41:50.59ID:/8g3afGg おまえらはなんですぐ破壊的なメモリアクセスしようとするんだよ。
696デフォルトの名無しさん
2019/10/30(水) 21:44:55.49ID:KWwo/1iW697デフォルトの名無しさん
2019/10/30(水) 21:47:25.90ID:M6J6raPE 変にトリッキーなことをせず普通に書けば平和なのに
698デフォルトの名無しさん
2019/10/30(水) 21:51:21.63ID:Z1e8Gfkt 平和を求めるならc++使わないことだな
699デフォルトの名無しさん
2019/10/30(水) 21:56:38.45ID:Z1e8Gfkt >>696
virtualでないと子のデストラクタは呼ばれないってのとごっちゃになってるとか?
virtualでないと子のデストラクタは呼ばれないってのとごっちゃになってるとか?
700デフォルトの名無しさん
2019/10/30(水) 21:57:32.16ID:/8g3afGg >>698
平和は求めるが性能も求めるから仕方なく使うのがc++だよ、馬鹿。
平和は求めるが性能も求めるから仕方なく使うのがc++だよ、馬鹿。
701デフォルトの名無しさん
2019/10/30(水) 22:07:52.76ID:KWwo/1iW >>699
多分それだ。もやもや取れたわ。ありがとう。
多分それだ。もやもや取れたわ。ありがとう。
702デフォルトの名無しさん
2019/10/30(水) 22:15:48.21ID:Z1e8Gfkt >>700
お前moveだからコピーコストゼロ!カロリーゼロとか言ってるだろ
お前moveだからコピーコストゼロ!カロリーゼロとか言ってるだろ
703デフォルトの名無しさん
2019/10/30(水) 22:18:45.46ID:T2yRPHdv >>693
正直何をしたいのかさっぱりわからん
正直何をしたいのかさっぱりわからん
704デフォルトの名無しさん
2019/10/31(木) 00:30:04.67ID:Mfb82uAb >>687
なるほど、想定していたのは、Windows環境限定だった。
なるほど、想定していたのは、Windows環境限定だった。
705デフォルトの名無しさん
2019/10/31(木) 01:11:19.07ID:Z73hoFPo >>679
> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
いや、 &arr[k + 1] - &arr[k] は 1 でしょ。
> その結果、古くからCの仕様書に載っている通り、
> &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
> の式が常に厳密に成り立つことが保証される。
少なくとも C++ の規格にもそんな保証は載ってないよ。
逆に、 TYPE が BYTE と一致するような場合を除いて、動作は未定義になると明記されてる。
https://timsong-cpp.github.io/cppwp/n4659/expr.add#6
たぶん C の規格にも無かったと思うんだけど、「Cの仕様書」って何のこと言ってるの?
>>680 も、規格で保証されると言ってるなら誤り。
特定の実装(特に C もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。
> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
いや、 &arr[k + 1] - &arr[k] は 1 でしょ。
> その結果、古くからCの仕様書に載っている通り、
> &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
> の式が常に厳密に成り立つことが保証される。
少なくとも C++ の規格にもそんな保証は載ってないよ。
逆に、 TYPE が BYTE と一致するような場合を除いて、動作は未定義になると明記されてる。
https://timsong-cpp.github.io/cppwp/n4659/expr.add#6
たぶん C の規格にも無かったと思うんだけど、「Cの仕様書」って何のこと言ってるの?
>>680 も、規格で保証されると言ってるなら誤り。
特定の実装(特に C もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。
706デフォルトの名無しさん
2019/10/31(木) 07:54:20.46ID:CWgnmwch 保証は知らんけどアドレス計算だから1じゃなくてsizeofの値じゃないのそれ
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども
707はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 12:29:41.78ID:/W+zTx1p >>705
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として
- ポインタを型変換して変換後のアライン (処理系定義) が正しければそれを元の型に再変換したものは変換前と等しい
- ポインタを別のポインタに型変換した後のアラインが正しくなければ未定義
- ポインタを文字を指すポインタに型変換した場合、オブジェクトの最も低位のアドレスを指す
- 文字を指すポインタに変換されたポインタは元のオブジェクトの大きさまで連続して増分すると
そのオブジェクトの残りのバイトへのポインタを順次生成できる
(注:ここで言うポインタには関数ポインタを含まない)
という保証は見つけられたので
(((BYTE *)arr) + sizeof(TYPE) * k)
までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として
- ポインタを型変換して変換後のアライン (処理系定義) が正しければそれを元の型に再変換したものは変換前と等しい
- ポインタを別のポインタに型変換した後のアラインが正しくなければ未定義
- ポインタを文字を指すポインタに型変換した場合、オブジェクトの最も低位のアドレスを指す
- 文字を指すポインタに変換されたポインタは元のオブジェクトの大きさまで連続して増分すると
そのオブジェクトの残りのバイトへのポインタを順次生成できる
(注:ここで言うポインタには関数ポインタを含まない)
という保証は見つけられたので
(((BYTE *)arr) + sizeof(TYPE) * k)
までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。
708デフォルトの名無しさん
2019/10/31(木) 13:00:56.65ID:Mfb82uAb709デフォルトの名無しさん
2019/10/31(木) 13:06:36.29ID:iFqs222y ×基礎
○妄想の中の理想世界・ご都合ワールド
○妄想の中の理想世界・ご都合ワールド
710デフォルトの名無しさん
2019/10/31(木) 13:21:36.49ID:Mfb82uAb https://en.cppreference.com/w/c/language/sizeof
1. sizeof( type ) Returns the size, in bytes, of the object representation of type
2. When applied to an operand that has structure or union type,
the result is the total number of bytes in such an object, including
internal and trailing padding. The trailing padding is such that
if the object were an element of an array, the alignment requirement
of the next element of this array would be satisfied, in other words,
sizeof(T) returns the size of an element of a T[] array.
3. Number of elements in any array a including VLA (since C99) may be
determined with the expression sizeof a / sizeof a[0]. Note that
if a has pointer type (such as after array-to-pointer conversion of
function parameter type adjustment), this expression would simply
divide the number of bytes in a pointer type by the number of bytes
in the pointed type.
https://en.cppreference.com/w/c/language/operator_arithmetic
10. If the pointer P points at an element of an array with index I, then
11. P+N and N+P are pointers that point at an element of the same array with index I+N.
12. P-N is a pointer that points at an element of the same array with index {tt|I-N}}.
20. If the pointer P1 points at an element of an array with index I (or one past the end)
and P2 points at an element of the same array with index J (or one past the end), then
P1-P2 has the value equal to J-I and the type ptrdiff_t (which is a signed integer type,
typically half as large as the size of the largest object that can be declared)
1. sizeof( type ) Returns the size, in bytes, of the object representation of type
2. When applied to an operand that has structure or union type,
the result is the total number of bytes in such an object, including
internal and trailing padding. The trailing padding is such that
if the object were an element of an array, the alignment requirement
of the next element of this array would be satisfied, in other words,
sizeof(T) returns the size of an element of a T[] array.
3. Number of elements in any array a including VLA (since C99) may be
determined with the expression sizeof a / sizeof a[0]. Note that
if a has pointer type (such as after array-to-pointer conversion of
function parameter type adjustment), this expression would simply
divide the number of bytes in a pointer type by the number of bytes
in the pointed type.
https://en.cppreference.com/w/c/language/operator_arithmetic
10. If the pointer P points at an element of an array with index I, then
11. P+N and N+P are pointers that point at an element of the same array with index I+N.
12. P-N is a pointer that points at an element of the same array with index {tt|I-N}}.
20. If the pointer P1 points at an element of an array with index I (or one past the end)
and P2 points at an element of the same array with index J (or one past the end), then
P1-P2 has the value equal to J-I and the type ptrdiff_t (which is a signed integer type,
typically half as large as the size of the largest object that can be declared)
711デフォルトの名無しさん
2019/10/31(木) 13:43:36.78ID:hGg8JwcT C++のヘッダファイルのクラス定義って、
privateまで定義しないといかんのが嫌だな。
privateだから内部に隠蔽されて、外部からは知らなくていい情報なのに
内部で使ってる型をヘッダファイルに書かなければいけないから、
それをincludeしてる方も、その型の存在を知ってしまう。
どうにかならんのかな?
privateまで定義しないといかんのが嫌だな。
privateだから内部に隠蔽されて、外部からは知らなくていい情報なのに
内部で使ってる型をヘッダファイルに書かなければいけないから、
それをincludeしてる方も、その型の存在を知ってしまう。
どうにかならんのかな?
712デフォルトの名無しさん
2019/10/31(木) 13:54:48.05ID:Nmr38VJU ヘッダに描くのをやめればいい
713デフォルトの名無しさん
2019/10/31(木) 14:01:21.28ID:Mfb82uAb >>710
「1.」によれば、sizeof(x)は、xのバイトサイズである。
「2.] によれば、xが構造体の場合、sizeof(x)には、構造体のメンバの間や
最後のpaddingのサイズまで含まれている。
「3.」によれば、TYPE a[N]; の場合、sizeof(a)/sizeof(a[0]) == N
が保証されている。a[0] の型は TYPE なので、これは、
sizeof(a)/sizeof(TYPE) == N
であることを示す。sizeof(a)とは、配列型a全体のサイズであるので、
これはつまり、a[k] のアドレスが、(a[0] のアドレス) + sizeof(TYPE) * k
であることを意味している。
よって、>>708 は正しい。
「1.」によれば、sizeof(x)は、xのバイトサイズである。
「2.] によれば、xが構造体の場合、sizeof(x)には、構造体のメンバの間や
最後のpaddingのサイズまで含まれている。
「3.」によれば、TYPE a[N]; の場合、sizeof(a)/sizeof(a[0]) == N
が保証されている。a[0] の型は TYPE なので、これは、
sizeof(a)/sizeof(TYPE) == N
であることを示す。sizeof(a)とは、配列型a全体のサイズであるので、
これはつまり、a[k] のアドレスが、(a[0] のアドレス) + sizeof(TYPE) * k
であることを意味している。
よって、>>708 は正しい。
714デフォルトの名無しさん
2019/10/31(木) 14:04:09.17ID:/uM4xbrd >>711
pimpl
pimpl
715デフォルトの名無しさん
2019/10/31(木) 14:46:45.02ID:Mfb82uAb >>705
>> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
>いや、 &arr[k + 1] - &arr[k] は 1 でしょ。
この場合の「差」とは、減算演算子 x - y の結果のことではなく、
アドレスの差のことです。丁寧に書けば、
「&arr[k] のアドレス値と &arr[k + 1] のアドレス値の差は、厳密に sizeof(TYPE)
に一致する。」または、
「arr[k] のアドレスと arr[k + 1] のアドレスの差は、厳密に sizeof(TYPE)
に一致する。」
となります。
>> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
>いや、 &arr[k + 1] - &arr[k] は 1 でしょ。
この場合の「差」とは、減算演算子 x - y の結果のことではなく、
アドレスの差のことです。丁寧に書けば、
「&arr[k] のアドレス値と &arr[k + 1] のアドレス値の差は、厳密に sizeof(TYPE)
に一致する。」または、
「arr[k] のアドレスと arr[k + 1] のアドレスの差は、厳密に sizeof(TYPE)
に一致する。」
となります。
716デフォルトの名無しさん
2019/10/31(木) 14:50:36.73ID:Mfb82uAb >>691
言語仕様的には決まっていませんが、Win32で実験する場合、
最初の質問者が、答えを見つける手段としては、正しいやり方なのです。
Win32で実験してヒープからの確保なのかどうか判明してしまえば、同じ
boostのソースを他の環境で動かしても、#ifdef などで動作が変えられていない
限りは、同じ結果となるからです。
言語仕様的には決まっていませんが、Win32で実験する場合、
最初の質問者が、答えを見つける手段としては、正しいやり方なのです。
Win32で実験してヒープからの確保なのかどうか判明してしまえば、同じ
boostのソースを他の環境で動かしても、#ifdef などで動作が変えられていない
限りは、同じ結果となるからです。
717はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 14:53:56.72ID:/W+zTx1p >>713
アドレスがどうこうじゃなくてキャストが許されるかっていう話なんだけど。
アドレスがどうこうじゃなくてキャストが許されるかっていう話なんだけど。
718デフォルトの名無しさん
2019/10/31(木) 15:27:23.28ID:CWgnmwch ポインタのキャストてポインタが指してるアドレスのデータの解釈だけの問題だから許されないキャストがそもそもないのでは
適切かどうかは知ったことではないが
というか配列のデータが連続していれば当然のごとく成り立つ話じゃん
それは保証されてるわけだし
適切かどうかは知ったことではないが
というか配列のデータが連続していれば当然のごとく成り立つ話じゃん
それは保証されてるわけだし
719デフォルトの名無しさん
2019/10/31(木) 16:06:33.06ID:hGg8JwcT720デフォルトの名無しさん
2019/10/31(木) 16:29:14.27ID:Mfb82uAb >>718
構造体型へのポインタ同士については、単なる解釈し直しではなく、
アドレスの加減算を伴うことがあります。
しかし、BYTE型へのポインタから構造体型へのポインタへのキャストに
ついては、解釈のし直ししか、コンパイルのしようがなく、その場合に
ついては、ポインタの指すオブジェクトがマシン後レベルで同じアドレス
を持つことになります。ただし、厳密な仕様は知りません。
構造体型へのポインタ同士については、単なる解釈し直しではなく、
アドレスの加減算を伴うことがあります。
しかし、BYTE型へのポインタから構造体型へのポインタへのキャストに
ついては、解釈のし直ししか、コンパイルのしようがなく、その場合に
ついては、ポインタの指すオブジェクトがマシン後レベルで同じアドレス
を持つことになります。ただし、厳密な仕様は知りません。
721はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 16:32:02.98ID:/W+zTx1p pimpl ってプライベートなメンバを隠したいだけのために導入するのは面倒くさ過ぎない?
手間かけてでもやりたいって場面もあるのかもしれんが、どうにも割に合う気がしない。
手間かけてでもやりたいって場面もあるのかもしれんが、どうにも割に合う気がしない。
722デフォルトの名無しさん
2019/10/31(木) 17:07:47.69ID:NdDnFbFX どうしても実装を隠さないと発狂する人が使う
723デフォルトの名無しさん
2019/10/31(木) 17:11:39.47ID:M7zdaumA unique_ptrで作ればそれだけで勝手にmovableなクラスになって便利だよpimpl
724デフォルトの名無しさん
2019/10/31(木) 17:17:39.90ID:hGg8JwcT >>721
プライベートなメンバを隠すと言うよりも
依存関係を断ち切らせたかった。
hoge.h と hoge.cpp があって、
hoge.cpp から #include<hoge.h> してる
main.cpp があってHogeクラスを使うから、#include<hoge.h> してる。
この時、mainは、Hogeクラスだけを使ってることにしたい。
でも、hoge.cpp は private で Hage func(); メソッドを定義してる。
つまり hoge.cpp は #include<hage.h> をしている。
そうすると,mainは、Hogeクラスだけ使うつもりなのに
間接的に hage.h もインクルードしてしまって、Hageクラスのこと知ってることになる。
Hogeを知るとHageも知ってしまう
Hageを隠したかったんだよ!
↑
言いたかったことはこれ
プライベートなメンバを隠すと言うよりも
依存関係を断ち切らせたかった。
hoge.h と hoge.cpp があって、
hoge.cpp から #include<hoge.h> してる
main.cpp があってHogeクラスを使うから、#include<hoge.h> してる。
この時、mainは、Hogeクラスだけを使ってることにしたい。
でも、hoge.cpp は private で Hage func(); メソッドを定義してる。
つまり hoge.cpp は #include<hage.h> をしている。
そうすると,mainは、Hogeクラスだけ使うつもりなのに
間接的に hage.h もインクルードしてしまって、Hageクラスのこと知ってることになる。
Hogeを知るとHageも知ってしまう
Hageを隠したかったんだよ!
↑
言いたかったことはこれ
725デフォルトの名無しさん
2019/10/31(木) 17:29:24.06ID:Mfb82uAb >>724
また髪の毛の話してる、などというと荒れそうなので決して言いません。
また髪の毛の話してる、などというと荒れそうなので決して言いません。
726はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 17:52:49.82ID:/W+zTx1p C++20 でモジュールの機能が入るとかいう話になってるから
それが成れば pimpl なんていらんようになると思うんだが、
実際のところモジュールの様子ってどうなの?ちゃんと入りそう?
それが成れば pimpl なんていらんようになると思うんだが、
実際のところモジュールの様子ってどうなの?ちゃんと入りそう?
727デフォルトの名無しさん
2019/10/31(木) 18:23:02.02ID:ZttcTVl1 無理。
テンプレートとの両立、オーバーヘッドの問題
どの視点でみてもくそなものしかできないことは明白。
こういうのに引っかかるバカが増えたよね。
テンプレートとの両立、オーバーヘッドの問題
どの視点でみてもくそなものしかできないことは明白。
こういうのに引っかかるバカが増えたよね。
728デフォルトの名無しさん
2019/10/31(木) 18:32:01.00ID:gpc+5FVL >>721
そう思うのは複数人で規模のでかいもの作ってないから
そう思うのは複数人で規模のでかいもの作ってないから
729デフォルトの名無しさん
2019/10/31(木) 19:37:56.00ID:/uM4xbrd pimplは開発規模は関係なくて、ライブラリの公開するヘッダでユーザーに関係ないものを隠すために使わないか?
730はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 20:03:49.64ID:/W+zTx1p731デフォルトの名無しさん
2019/10/31(木) 20:09:29.87ID:jES25g+p 個人的には、自分ひとりで作ってるプログラムは、高頻度で全ビルドに
かける癖が付いてしまってる。
こうしておくと、OSをSleepモードにしていて、誤って電源を切ってしまったような
時にIDEが管理しているプロジェクトのデータファイルの何かが壊れていても
気付なかった時や、プロジェクトのバックアップ処理の時のコピー操作の何らか
の間違いで何かがおかしくなってしまったようなときに変な不具合に悩まされなく
て済む。
かける癖が付いてしまってる。
こうしておくと、OSをSleepモードにしていて、誤って電源を切ってしまったような
時にIDEが管理しているプロジェクトのデータファイルの何かが壊れていても
気付なかった時や、プロジェクトのバックアップ処理の時のコピー操作の何らか
の間違いで何かがおかしくなってしまったようなときに変な不具合に悩まされなく
て済む。
732デフォルトの名無しさん
2019/10/31(木) 22:29:01.40ID:GkSnEle2 C++とオブジェクト指向をきちんと身につけてる人ばかりの環境ならいいんだけどね、pimpl
経験不足な人だと理解出来なさそう
経験不足な人だと理解出来なさそう
733デフォルトの名無しさん
2019/10/31(木) 22:54:10.87ID:/p/NkBNt 使ってるうちにインターフェースを使った典型的な奴とそう変わらない事に気付く
734デフォルトの名無しさん
2019/10/31(木) 22:58:21.62ID:KjvgkRuG 継承使いたくないからpimplの方が好き
735デフォルトの名無しさん
2019/10/31(木) 23:14:49.56ID:FGj4X+XO cpprefjpのサンプルの赤字の部分使い方合ってる?
https://cpprefjp.github.io/reference/memory/allocator_traits/select_on_container_copy_construction.html
https://cpprefjp.github.io/reference/memory/allocator_traits/select_on_container_copy_construction.html
736デフォルトの名無しさん
2019/10/31(木) 23:43:47.06ID:/p/NkBNt 確かに、select_on_container_copy_construction(other.alloc_)が正しいような気はする
737デフォルトの名無しさん
2019/11/01(金) 00:03:47.15ID:8rUFWNXZ テンプレート活用のための最適化が全盛期の今 pimpl は時代遅れ。
738デフォルトの名無しさん
2019/11/01(金) 00:09:16.78ID:rKg4WNgJ はいはい
739デフォルトの名無しさん
2019/11/01(金) 00:19:47.84ID:TUcr0tQH pimplが時代遅れというのなら、それに代わる
依存する必要がない所を断ち切る方法を提示してくれ
依存する必要がない所を断ち切る方法を提示してくれ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【社会】40代以上のおじさん・おばさんは叩いてオッケーという風潮はなぜ加速したのか [七波羅探題★]
- 自分に自信がない女の子、陽キャ美容室で80cmのエクステを付けた結果wwwwwwwwwwwwwwwwwww [329329848]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【朗報】外務省局長、中国側の要求を断固拒否。「高市さんの答弁は日本政府の立場を変えるものではないし、撤回しない」 [519511584]
- 農林水産省「春頃にはコメ価格落ち着くのでは」新米の取引価格、過去最高を更新。 [256556981]
