C++相談室 part164

■ このスレッドは過去ログ倉庫に格納されています
2023/05/09(火) 11:50:52.06ID:EYc2I7oW0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part163
https://mevius.5ch.net/test/read.cgi/tech/1672409791/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/06/19(月) 12:20:34.90ID:4PINPeBN0
つまりvector<int>を使いなさいということ
2023/06/19(月) 12:21:25.69ID:wGtx/iKL0
>>251
安価ミス
2023/06/20(火) 00:04:57.81ID:YSi65ASja
実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、
Koenig lookup とも言う

「Cプログラミングの落とし穴」の著者、
Koenigが、C++ に入れる事を推奨した

ADLを知っているなら、かなりのプロと言える
2023/06/20(火) 00:18:46.72ID:vGfe0Eju0
勉強になります
2023/06/20(火) 02:12:24.83ID:1vctBLGTa
演算子のオーバーロードなら、フレンド関数とか?

非メンバの演算子オーバーロード | Programming Place Plus C++編【言語解説】 第35章

https://programming-place.net/ppp/contents/cpp/language/035.html
2023/06/20(火) 10:05:39.77ID:IIzrqfbq0
状況を簡略化するとこう。

namespace ns {
struct foo {};
template <class T>
void bar(const T&) {
T() + T();
} };

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

int main() { bar(ns::foo()); }

ADL は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 この場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。)
だから順序を変えれば通る。

namespace ns {
struct foo{};
};

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

namespace ns {
template <class T>
void bar(const T&) {
T() + T();
} };

int main() { bar(ns::foo()); }

当然ながら std の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとするのは筋が悪いということになる。
2023/06/20(火) 10:53:08.18ID:vGfe0Eju0
>>260
>だから順序を変えれば通る。
最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが
前者のケースが通らなくなりまして疑問に思っていたところでした
10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい?
2023/06/20(火) 11:41:30.21ID:IIzrqfbq0
>>261
前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で
プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。
2023/06/20(火) 13:36:04.44ID:vGfe0Eju0
なるほどー
有難うございます
264デフォルトの名無しさん (JP 0H91-FhUT)
垢版 |
2023/06/20(火) 21:39:35.82ID:Pk8V/jejH
template<typename Callback>
void func(Callback cb)
{
//cb(1); // A
//cb(1,2);// B
}

void f1(int){}
void f2(int,int){}

int main(){func(f1);}

AとBをコンパイル時に呼び分けたいんですけど
どのように記述すればよいか教えていただけませんか?
2023/06/20(火) 22:18:37.18ID:Cuq1USIJ0
is_invocableでおk
2023/06/20(火) 22:21:49.81ID:IIzrqfbq0
>>264
渡されたコールバック関数の引数の数によって区別するってこと?
素朴な方法だとオーバーロードするのが手っ取り早いと思う。

void func(void (*cb)(int)) {
cb(1);
}

void func(void (*cb)(int, int)) {
cb(1, 2);
}

void f1(int) {}
void f2(int, int) {}

int main() {
func(f1);
func(f2);
}
2023/06/20(火) 22:27:55.14ID:vGfe0Eju0
>>264
template<typename Callback> void func(Callback cb);
template <> void func(void (*cb) (int))
{
(*cb)(1); // A
}
template <> void func(void (*cb) (int, int))
{
(*cb)(1,2);// B
}
void f1(int){}
void f2(int,int){}
int main(){func(f1);}
2023/06/20(火) 22:29:12.98ID:vGfe0Eju0
templateが意味ないね
2023/06/20(火) 22:39:00.27ID:ui/rWsWf0
265が言うようにis_invocable使うとこんな感じ?

template<typename Callback>
void func(Callback cb)
{
if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}
}
2023/06/20(火) 22:41:37.75ID:vGfe0Eju0
>>269
これって関係ないif節はコンパイル時に消えるの?
2023/06/20(火) 22:43:20.79ID:IIzrqfbq0
>>270
消えるよ。
272デフォルトの名無しさん (JP 0H91-FhUT)
垢版 |
2023/06/20(火) 22:44:14.18ID:Pk8V/jejH
>>269
ありがとうございます。
gcc 13.1.0 でc++17でうまくいきました。

後出しで申し訳ありませんが、C++14でかけませんか?
2023/06/20(火) 22:47:27.45ID:vGfe0Eju0
>>269,271
これは知らんかった
勉強になるなぁ
274デフォルトの名無しさん (JP 0H91-FhUT)
垢版 |
2023/06/20(火) 22:48:18.64ID:Pk8V/jejH
>>269
まさにこれをやりたかったです。

template<typename Callback>
void func(Callback cb)
{
// こことか

if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}

// ここをどうしようか悩んでいました
}
2023/06/20(火) 22:59:00.24ID:IIzrqfbq0
>>272, >>274
ひとつの関数テンプレート中でやりたいってこと?
if constexpr が導入される前だとオーバーロードなり特殊化なりで
別の関数として分離しないと書けないと思う。

is_invocable に相当するものは自分で書こうと思えば書けるが
if constexpr は言語のコアの機能だからどうにもならんし……。
276デフォルトの名無しさん (JP 0H91-FhUT)
垢版 |
2023/06/20(火) 23:14:31.48ID:Pk8V/jejH
>>275
情報ありがとうございます

ご掲示いただいたコードで勉強になりました。
2023/06/20(火) 23:42:05.71ID:zCL4VLm70
>>273
ザッツcostexprマジック
2023/06/20(火) 23:43:57.61ID:zCL4VLm70
n抜けてたwコストがかかる演算なのは確かだけどw
constexprマジック!マジック!
279デフォルトの名無しさん (ワッチョイ 32fb-dYQK)
垢版 |
2023/06/21(水) 00:07:10.76ID:2lh42auf0
C++11のSFIANE地獄へようこそ
https://wandbox.org/permlink/2sfUVeEBrErqvI2R

template関数の実体化が1つだけ成功して、
他が失敗するように仕掛ければ呼び分けは可能。

ただ見ての通り相当面倒なことを書かなきゃならない。
2023/06/21(水) 00:28:02.40ID:CWKUsltc0
>>279
>>266と本質的に何が違うのか分からない
解説よろしく
(templateでやってることは無駄なのでは?)
2023/06/21(水) 00:41:42.51ID:3HBFHOpK0
>>280
いや、 >>279 のほうがちょっと柔軟で使いやすい。
たとえば

void f3(long int, long int) {}

みたいなのを渡したとき >>266 ではエラーになる。
引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
2023/06/21(水) 00:42:09.27ID:LxMKpynY0
templateでやるのは質問者の与えた要件だな
宿題なんじゃね、しらんけど
283デフォルトの名無しさん (ワッチョイ 32fb-9xvA)
垢版 |
2023/06/21(水) 00:52:13.25ID:2lh42auf0
C++14にはif constexprが存在しないから
template使ったオーバーロードしか手段がない

質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示
2023/06/21(水) 01:17:47.52ID:CWKUsltc0
>>281,283
ありがとう
>引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
>厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
こういうことね
285デフォルトの名無しさん (ワッチョイ a901-UvLK)
垢版 |
2023/06/21(水) 04:29:46.61ID:IDPPhD2V0
>>260
あー本来グローバルも対象になるのか、適当こいてスマソ

だが>>248で質問者が言ってるように、元のコードで順序を変えてもダメなのよ
何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった

namespace ns {
template <class T = int>
struct foo{};

// added
struct hoge{};
int operator +(const hoge &x, const hoge &y) {return 1;}
};


ns::foo<> operator+(const ns::foo<>& x, const ns::foo<>& y) { return ns::foo<>(); }

namespace ns {
template <class T>
void bar(const T&) {
T() + T();
} };

int main() { bar(ns::foo<>()); }

すでに名前空間内に同名の関数があった場合はダメっぽい
286デフォルトの名無しさん (ワッチョイ a901-UvLK)
垢版 |
2023/06/21(水) 09:44:10.00ID:IDPPhD2V0
あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが)
2023/06/21(水) 10:22:19.76ID:3HBFHOpK0
>>285
名前探索 (name lookup) は狭い名前空間から探索していって
合致する名前があればそれより外側に同名の関数があっても
オーバーロード解決に参加しない。

わかりやすい例で言えばメンバ関数は非メンバより優先されるし、
メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。

void foo(void) {}

struct bar {
void baz(void) {
// この foo は bar::foo のこと
// 名前が見つかった時点でそれより外の名前空間は見に行かないので
// 引数が合わなくても他の候補は試みられずエラーになる。
foo(1);
}
void foo(void) {}
};
2023/06/21(水) 10:34:08.97ID:3HBFHOpK0
例をちょっと間違えたのでやりなおし。

void foo(int) {}

struct bar {
void baz(void) {
foo(1);
}
void foo(void) {}
};

こうすると非メンバ関数の foo は候補にすらならないという話。
2023/06/21(水) 11:00:59.24ID:CWKUsltc0
g++更新にともない
自前ライブラリのビルドでエラーが出るようになって
悩んでたところを解説してくれてる
マジで凄い人達だな
290デフォルトの名無しさん (ワッチョイ a901-UvLK)
垢版 |
2023/06/21(水) 11:31:26.94ID:IDPPhD2V0
>メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
thx。確かにこれ経験したことあるわ・・・ややこしいし名前変えて対処したけど
2023/06/21(水) 12:13:25.08ID:3HBFHOpK0
>>285 の例は using を使う形でも解決できる。 (設計意図によってはそれが妥当かどうかわからんけど。)

namespace ns {
struct foo {};

struct hoge {};
int operator+(const hoge& x, const hoge& y) { return 1; }
};

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

namespace ns {
template <class T>
void bar(const T&) {
using ::operator+; // グローバルな operator+ をオーバーロード候補として参加させる
T() + T();
}
};

int main() { bar(ns::foo()); }


テンプレートを見る機会がよくあるなら std::begin を using している事例は見たことがあると思う。
2023/06/21(水) 12:20:53.22ID:s1sJDdcu0
C++って、こういう悪夢みたいなテクニックで溢れかえってるよなあ
RustやらPythonだのに人気が移るわけですよ
2023/06/21(水) 12:23:49.28ID:xjKiS8Z6M
記法でいうならNimがいいよ。
2023/06/21(水) 16:00:35.62ID:3HBFHOpK0
カスタマイズされた関数が呼ばれるようにする綺麗な方法として customization point object という概念が近頃は導入されてる。
綺麗な方法というか汚い部分はライブラリに隠すってだけなんだけど。
真似してみてもいいかもね。

より綺麗な方法が導入されるのはいいんだけど、
過去の方法が消えてなくなるわけでもないし完全に置き換えられるわけでもないからなぁ。
個々には良くなっても全体としては余計に複雑になるだけってのもよくある話。
https://m.xkcd.com/927/
2023/06/22(木) 09:50:22.29ID:+UOgHQ6A0
max RSS (メモリ総量) の取得ってWindowsとLinuxでポータブルな方法ないの?
296デフォルトの名無しさん (スプッッ Sd12-9xvA)
垢版 |
2023/06/22(木) 10:07:05.02ID:T+/An9G4d
C++標準ライブラリには無い

外部ライブラリに頼るか自分で実装するかになるけど、結局のところ#ifdefでOS依存の機能を呼び分けるしかない
2023/06/22(木) 10:35:39.47ID:myrOOi5M0
std::uintptr_t get_available_memory();
とプロトタイプだけ用意して、定義を環境別に作るだな

内容的に割と単純な処理のはずで
環境別に用意といってもたいした工数にはなるめえよ
2023/06/22(木) 17:54:50.46ID:Sn58Ngpoa
Nim いいよね
C++ 嫌になったら Nim においでおいで
2023/06/23(金) 06:00:18.48ID:AFPisFIg0
なんかのオブジェクトをポインタじゃなく実体として持ってるとして、それを delete するやり方ってないの?
たとえば std::vector A に対して
delete &A;
みたいな
2023/06/23(金) 06:14:43.58ID:Dz+tkRpF0
「実体を持っている」と言うが「誰が」持っているかにもよる
グローバル変数として宣言しているなら予めメモリ上に確保されているから破棄は無理(強引に再利用はできる)
スコープ内で変数として宣言したのなら必要なメモリはスタック上にあるからスタックを弄るしかない
別のオブジェクトのメンバ変数として宣言されているならそのオブジェクトを破棄する
2023/06/23(金) 06:17:44.59ID:Dz+tkRpF0
スコープ内でってのはローカル変数の意味で言ったの
302デフォルトの名無しさん (ワッチョイ 3602-Ul6j)
垢版 |
2023/06/23(金) 07:14:23.97ID:GEB8UNzF0
A.~vector<>();でいいんじゃないの?
メモリ解放が必要ならdelete(void*)&A;とかして。
2023/06/23(金) 07:18:45.05ID:v++V1HM40
>>299
deleteはdynamic storage durationのオブジェクトにのみ許される
std::vector<int> A;はautomatic storage durationの場合はその定義を囲むブレースから逸脱すれば破棄される
static storage durationの場合はプログラムの実行終了時に破棄される
thread storage durationの場合はスレッド終了時に破棄される
2023/06/23(金) 07:19:36.07ID:pmKt7pYtM
極論すれば、c++の変数は自動変数しか無いから、変数で定義しているものはコンパイラに任せるしか無い。
2023/06/23(金) 07:23:15.08ID:v++V1HM40
> c++の変数は自動変数しか無い

???
2023/06/23(金) 08:10:40.98ID:Z0FiiE+w0
変数の生命期間よりも前に絶つのは new したものを delete する方法しかないよ

std::vector* pA = new std::vector();
std::vector& A = *pA;
 :
 Aで操作
 :
delete pA;
この後 Aに対して操作すると鼻から悪魔
2023/06/23(金) 08:36:05.01ID:v++V1HM40
auto&& A { *new std::vector<int>(0) };
delete &A;
これで「実体」のように偽装はできるけど
こんなコード書くやついたらグーパンだよ
2023/06/23(金) 08:38:29.90ID:OoWAXDqh0
このスレ読んでると目の裏がチカチカしてくるなw
2023/06/23(金) 08:46:52.36ID:z+mnuoLR0
>>305
極論すれば、と言っているだろ。
せめて反例ぐらい出せよ。
2023/06/23(金) 09:45:42.49ID:v++V1HM40
反例っておまえ・・・

静的変数
2023/06/23(金) 10:11:58.67ID:Zb3L9Wmq0
>>299
deleteで何をしたいかによるな
deleteは
・デストラクタを呼び出して
・メモリを開放する
という2つの動作が含まれるが、「メモリを開放する」に関しては、確保されてもいないメモリはもちろん開放できないが、
デストラクタは実体としてはただの関数なので、普通に呼び出すことは可能
ただし、メモリが開放される(deleteされる)時にもデストラクタはもちろん呼び出されるので、2重に呼び出しても大丈夫なように設計されたクラスである必要はある
2023/06/23(金) 11:56:54.20ID:jOpqVfQE0
>>299
スコープを終わらせれば消える
2023/06/23(金) 13:49:52.85ID:RsoTpuHzM
Windows11でc++の開発したいんですけど開発環境何を選べばいいですか?
ちなみに趣味でおもちゃ言語のコンパイラを書こうと思います
314デフォルトの名無しさん (スッップ Sdb2-Ul6j)
垢版 |
2023/06/23(金) 14:29:49.42ID:P5Uu3Ce/d
wslのclangでいいんじゃないの
2023/06/23(金) 14:40:39.89ID:79pDbKtj0
>>311
> 2重に呼び出しても大丈夫なように設計されたクラスである必要はある
trivial destructor 以外は(空の ~T() {} 含め)どうがんばっても大丈夫にはならず未定義動作となる模様。
https://timsong-cpp.github.io/cppwp/n4868/basic.life#9.sentence-1
2023/06/23(金) 14:42:57.84ID:XaN8/xk5M
>>314
visual studioでできませんか?
visual studioに依存しないような形で
2023/06/23(金) 14:49:06.12ID:Xemzxb7u0
>>316
依存するかしないかはプログラマが気を付けることだろ
2023/06/23(金) 14:58:36.88ID:v++V1HM40
>>316
つーか俺はVisual Studioを推奨する
コンパイラ本体が昔からしっかりしてるし
デバッガは無数の信者を抱えるクオリティ
2023/06/23(金) 15:11:25.32ID:Xemzxb7u0
俺はコンパイラは複数を利用するのが好ましいと思う。
気を付けてても処理系に依存している (または未定義を踏んでいる) こともある。
いくつかのコンパイラで試してみれば問題点を発見しやすい。

発現した問題についてはデバッガなりなんなりで追えばいいんだが、
問題が潜伏したまま表面に現れないってのは後になってじわじわ効いてきたりするし……。
2023/06/23(金) 16:11:46.79ID:lCxAQSJFa
>>299
デストラクタに直接リソース解放させるより
リソース解放用の dispose() みたいな関数を造っておいて
デストラクタから dispose() 呼ぶのと同時に
delete しないで dispose() だけ外から呼ぶ設計もあるよ
2023/06/23(金) 16:14:47.39ID:lCxAQSJFa
>>313
Code::Blocks (+ mingw)
2023/06/23(金) 18:47:00.64ID:5tcqgCxE0
コンパイラの本なにがいいのかオススメ聞いたらオッサンに聞いたら怪獣が書いてある本って云われて本屋行って買ったらあとで付録のFDD誰かにかっぱわられていタコとに気付いたけどその本一冊ではなんの役にも立たないクソみたいな本だったわ
そのあとオライリーのyacc&lexの本と早乙女氏のBison&Flex本で学び直したわ
2023/06/23(金) 19:05:06.07ID:5tcqgCxE0
良く見たら全然違ったわw
https://i.imgur.com/DHAPVXR.jpg
yacc&lexが早乙女氏でBison&Flexが五月女氏でオライリーに似てるけどASCII出版やったわ
2023/06/23(金) 19:51:54.58ID:s3XGk2XtM
>>316
まず動くものを作ることに注力したほうがいい。
どうせ最初のコードは(問題領域の学習後に)捨てることになるから、プロトタイプと割り切るべき。あんまり頑張ると進捗悪くて挫折するし、うまく行ってもコンコルド効果で酷い目にあう。

>>310
確かに静的変数は自動だけど別物だな……よくやった。悔しいが褒めてやろう。
2023/06/23(金) 22:40:53.53ID:Xemzxb7u0
>>324
???
storage duration は四種類の内の「ひとつ」であることは直接的に明記されていて解釈の余地がない。
https://timsong-cpp.github.io/cppwp/n4861/basic.stc#1
兼ねる場合は存在しない。
326デフォルトの名無しさん (ワッチョイ 6501-2DXs)
垢版 |
2023/06/24(土) 08:29:33.32ID:31MSzc3x0
>まず動くものを作ることに注力したほうがいい。
+1票

>いくつかのコンパイラで試してみれば問題点を発見しやすい。
これはその通りだけど、もっともっと先の話
2023/06/24(土) 09:51:19.10ID:xNNc2oEW0
動くといってもHello worldじゃあまりにもモチベーションに乏しいから
何でもいいから目的目標を持ったプログラムを書いたほうがいい
2023/06/24(土) 12:57:29.18ID:rXisqo0O0
>>327
この話題の大元である >>313 でコンパイラを書くと書いてあるよ。
329デフォルトの名無しさん (ワッチョイ 6501-wYA+)
垢版 |
2023/06/24(土) 20:48:58.11ID:rm+SB6K20
ドラゴンブックでは?
誤植を指摘できるくらい読み込めば古典は理解できてると思う
330デフォルトの名無しさん (アウアウウー Sa69-F3wx)
垢版 |
2023/06/27(火) 14:41:09.50ID:DdZG5nY/a
いつまでも初心者を抜け出せない人は初心者本を読み過ぎ
2023/06/27(火) 17:36:09.51ID:59BI4JPS0
初心者本は【ど】初心者のうちだけにしとけ
謙虚なことはいいことだが、ここだけは背伸びしたほうがいい

初心者本で何か知ったら、それで禿本がどのくらい読めるようになったかやってみれ
禿本が普通に読めるようになったら次はISOの規格票
2023/06/27(火) 17:38:22.91ID:59BI4JPS0
逆もしかり
ISOの規格票であえなくギブしたら禿本
禿本でギブのとき初心者本に戻る感じな
2023/06/27(火) 18:00:18.69ID:h1cnuIf90
特にC++は下手な参考書より規格の方が分かりやすかったりするからな…
2023/06/27(火) 18:15:38.33ID:D2orubkn0
初心者へのアドバイスに禿本とかいう隠語をつかうのはどうかと思う
2023/06/27(火) 18:27:04.42ID:KKkR5HKI0
今独学でC++学んでいるんですが、たまたま見つけたサイトでint32_tとありましたが
int変数を宣言するのにint32_tなんて使いませんよね?
intでokですよね?
2023/06/27(火) 18:34:12.56ID:3myjDgNL0
何に使うか次第
2023/06/27(火) 18:46:35.68ID:gpD88JT50
>>335
32ビット長である必要があるときだけint32_tを使えばいいよ
2023/06/27(火) 19:26:51.01ID:KKkR5HKI0
サンクス
2023/06/27(火) 19:30:48.55ID:wxXBe/Gr0
>>335
int は言語仕様では少なくとも -32767 から 32767 を表現可能な幅 (つまり 16 ビット) を持つことが規定されている。
具体的な大きさは処理系定義であって、最低限である 16 ビットかもしれないしもっと大きいかもしれない。
扱おうとする値の範囲が 32 ビット分の幅が必要であると見積もったなら int32_t が適切なこともある。

ただ…… int32_t は「条件に合致する整数型を処理系が持っているなら必ず提供しなければならない」ということになっているので、逆に言えば 32 ビット幅の整数型を持たない処理系では int32_t が存在しないことが許される。
C++ は処理系定義ということにしている項目がたくさんあって移植性を考慮しようとするとすごく大変なんだが (プログラマが想定してさえいれば) ある程度に広く対応可能な仕組みとしてこういう回りくどいものがある。
初心者の内はとりあえず自分の環境で動くものを作れるようになるというので十分だと思うよ。
2023/06/28(水) 05:36:22.40ID:p/gJzJ+n0
>>334
知らなきゃ聞くだろ
2023/06/28(水) 05:40:48.88ID:PRZu9/2Od
>>340
禿本って誰ですか?
2023/06/28(水) 07:54:48.30ID:p/gJzJ+n0
Bjarne Stroustrup著 The C++ Programming Language
ISBN-10 4797375957
2023/06/28(水) 07:55:45.79ID:p/gJzJ+n0
禿のブログ
https://www.stroustrup.com/
2023/06/28(水) 11:12:40.66ID:MFKAAcNx0
>>340
誰も知らないから隠語なんだよ
たまにいるよな、相手の知らないであろう単語を使ってマウントを取った気分になるやつ
2023/06/28(水) 12:11:22.15ID:gg0vhlU/M
>>340
検索すると別人の本が出てくるから駄目だろ。
2023/06/29(木) 00:03:54.47ID:XHjEw6wR0
C++でintと書けない理由はほぼほぼwindowsのintが32ビットと定義されているからで、
逆に言えば100% windowsで動かさないとあらかじめ分かっているならint使って書くよ
2023/06/29(木) 07:49:46.01ID:0UnKiO4J0
せいぜい数十までの整数でも、いちいちint8_tになんかしねえな
2023/06/29(木) 08:15:54.28ID:l+ZsGqGg0
巨大な配列なら話は別だが単発の整数がレジスタより小さくても得なことが無いからな。
2023/06/29(木) 08:19:17.75ID:beCjxg/z0
通信関連でペイロードに ビット長指定されてるのなんかは int○_t 使っときたい
2023/06/29(木) 11:02:12.05ID:prJHgW/t0
intでもshortでもCPUの計算速度は同じ
2023/06/29(木) 11:11:38.45ID:l+ZsGqGg0
四則演算では int より小さい整数は int に拡張する変換が入ることになってるし、
int を受け取る関数でも当然に変換されるので
変換する処理の分だけ素朴なコンパイラだと short のほうがコスト高になる可能性もある。
2023/06/29(木) 11:21:22.19ID:prJHgW/t0
言葉足らずだったな
初学者向けに正確にいえば
ビット数の低い数値の型にしたからといって
計算速度が速くなるワケじゃない

理由はハチミツ氏の記述通り
2023/06/29(木) 17:52:26.59ID:XHjEw6wR0
型のサイズが大きいほどキャッシュミスの確率が上がるし
ベクトル化の効率も関わってくるから話はそう簡単でもないけどな
2023/06/29(木) 18:01:09.64ID:l+ZsGqGg0
チューニングが必要になったら実測しろってのはそういうことよな。
やってみるまでわからん。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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