C++相談室 part160

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
967デフォルトの名無しさん
垢版 |
2022/05/21(土) 00:17:23.34ID:SL+9c0t4
コンパイラによってつける属性変えるときとか
public:をオンオフしたり構文に影響を与えるものとか

MSVCの標準ライブラリ覗くと
#define _CONSTEXPR20 constexpr
//#define _CONSTEXPR20 inline //C++17以前
とか書いてあったりする

式を文字列として展開するのもマクロじゃなきゃできない
#define A(exp) #exp

文字列連結(#define A(a1,a2) a1##a2)もマクロじゃなきゃできないけどデバッグが無理ゲーになるから使わん
2022/05/21(土) 00:19:10.39ID:DcWHGr0j
__FILE__や__LINE__を使うのを隠蔽したいときはマクロにするしか、
あと文字列を結合してシンボルを合成するとか、
#define cat(a, b) a##b
#define cat2(a, b) a/**/b
2022/05/21(土) 00:53:48.99ID:SKvcmC+r
マクロでぐにゃぐにゃしてる中はデバッガで止めづらくなるね
文字列生成(そして文字列の連結) 識別子の連結 はプリプロセッサじゃないとできないし
2022/05/21(土) 01:31:55.43ID:wrIep829
初見殺しにマクロは必須
2022/05/21(土) 06:57:00.43ID:0jWT+RR4
というか、inline 指定を絶対化すればいいだけ
どうして inline 指定してもインラインされない場合がある、とか勝手なことをするのか不明
2022/05/21(土) 07:00:24.57ID:LKZ4AMgL
#define AAAA xxxx
#include "****"
#undef AAAA

#define AAAA yyyy
#include "****"
#undef AAAA
2022/05/21(土) 07:11:17.89ID:DcWHGr0j
>>971
再帰する場合は仕方が無い
ポインタ経由で呼び出す場合も仕方が無い
2022/05/21(土) 08:09:54.00ID:0jWT+RR4
>>973
閾値を決めて閾値を超えてとまらないことがわかったら「エラーを出してコンパイルを止める」べきで、勝手に inline を無視してコンパイルしなおすなんて言語道断、コンパイラ作者の独善だね
2022/05/21(土) 08:21:34.76ID:/PQRaHnB
今やregisterなみの存在感
2022/05/21(土) 10:25:33.17ID:qJClzxWq
#includeと#defineで疑似メタプログラミング的なことをすることはある
テンプレート化出来ない場合もあるからな
2022/05/21(土) 10:48:13.19ID:Kirg9sMV
constexprが中途半端で結局constevalが追加されたのに倣えば、inlineの強制バージョンも標準化していいはずだよな
既に独自実装のalways_inlineや__forceinlineはあるんだし
2022/05/21(土) 11:13:07.39ID:JD6rd3hb
C++ は見かけ上の動作が仕様通りならどういう機械語を生成するか規定しないのが原則だから……。
言語仕様的には constexpr やら consteval も定数式として使える範囲を拡大しただけで、生成される機械語に対しては要求をしてない。
(想定はしていると思うけど。)
2022/05/21(土) 11:49:29.76ID:DcWHGr0j
翻訳系の仕事はソースコードの意味を変えずにオブジェクトコードに翻訳することで(ry
狭義のアルゴリズム(シングルスレッド条件、有限ステップで結果出力)の入力と出力の関係が翻訳前後で同じ結果になるならおk
最適化はボランティア活動みたいなもん
だいたいコルモゴロフ複雑性的な意味で一意な解など一般に無いし
2022/05/21(土) 12:00:28.50ID:DcWHGr0j
ていうかDFTと逆DFTおよび4n乗根のDFTと逆DFTができましたよ
https://ideone.com/uK9v58

n語のフーリエ変換にメモリを2n語使って良いなら話は簡単やが
>>695 のソースコードはn語で済ませているから黒魔術を駆使しているに違いない
>>695 の作者は漏れよか頭良すぎ(いやいい意味で、
2022/05/21(土) 14:44:04.21ID:0jWT+RR4
>>978
>C++ は見かけ上の動作が仕様通りならどういう機械語を生成するか規定しないのが原則だから……。
だとすると、inline の存在自体が原則に大きく矛盾していることになりますねえ
2022/05/21(土) 14:47:32.33ID:is6KmnjI
あくまでもヒントじゃないのか
2022/05/21(土) 15:01:05.79ID:0jWT+RR4
>>982
そんな曖昧な態度だから、マクロによるインラインが跋扈してしまうんです、inline に限っては強制力を伴うべきでしょう、#define マクロを葬り去りたいのなら
2022/05/21(土) 15:01:21.03ID:OwY6A3+8
そう
あくまでヒント

ヒントになった理由は
世の中のプログラマーがアホだから
2022/05/21(土) 15:01:54.43ID:OwY6A3+8
#defineは永遠に不滅です
2022/05/21(土) 15:23:50.89ID:ocVGFLUP
CRTPにするとインターフェース継承してもインライン展開されるのほんとまじ意味わからん
2022/05/21(土) 15:35:03.49ID:0jWT+RR4
>>984
マクロ跋扈とを許す設計者の方がもっとアホですね
2022/05/21(土) 15:39:45.82ID:LSoM7sSc
誰の方がアホとかどうでもよくて
アホだからそういう仕様になった
2022/05/21(土) 16:03:58.87ID:DcWHGr0j
ちと別件に取り掛かったのでソースコードを見ながらではなく想像やが
>>695 のソースコードでやっている頻繁なswapの意図がわかった希ガス
 X(k) = Σ[j=0..n-1]{ x(j) * w^(j*k) }
を計算するとき項の足し合わせ順序はどうでも良く、かつk>1なら
 j * k = 0 (mod n)  --- (1)
となるx(j) * w^(j*k)が複数回現れるから、(1)を満たす項の出現回数が大きいものを最初に足し合わせたらたちまち
(出現回数)-1語 のメモリが空く、というのが基本的着想で、
これを異なるkについて繰り返し行う場合(1)を満たす最大の出現回数となるjの系列jはk毎に相違するから、
kについての繰り返しについても部分計算を片付けてメモリを空けつつ進められ、
結局jとkの2重ループについてメモリを空けつつつつがなく進められるというしくみ(多分
2022/05/21(土) 16:11:12.45ID:JD6rd3hb
>>981
inline は ODR の例外。 また、異なる翻訳単位の同じ定義が統合されることを保証する。
これは C++98 のときからそう。
インライン化が望ましいことの指示であるとは書いてあるけど、
今では変数にも inline を付けることが出来るようになったのはもはや inline は ODR の例外としての意味がメインだと考えるべき。
2022/05/21(土) 16:29:48.48ID:9lV47uLv
>>981
展開を強制したいならforceinlineあるやんけ(メジャーなコンパイラの拡張だけど
2022/05/21(土) 16:47:52.13ID:x3bK44aY
onlineも導入すべき
993デフォルトの名無しさん
垢版 |
2022/05/21(土) 17:00:45.58ID:+x02zxlN
>>952
こんなのあるんか便利そうだな
まあ汎用的なデータ構造だと暫定未定義にするだけでもいいと思うけど、用途が決まってるクラスに関しては制約をつけたものを用意しておくのが無難だろうね
2022/05/21(土) 17:25:58.12ID:0jWT+RR4
>>991
情報ありがとうございます。

>>990
ここで One Definition Rule がリファーされるのに直観的違和感を覚えます‥‥
が、反論はゆっくり考えますのでしばらくお待ちください、様々な視点を提供いただき感謝しております
2022/05/21(土) 17:56:26.14ID:JD6rd3hb
>>994
inline というキーワードの選択が不自然なのはわかるが inline はインライン化の指示というよりは
インライン化に都合のよいように制限する指示と考えるとそんなに不自然でもない。

① C/C++ は翻訳単位ごとに個々にコンパイルしてからリンクする手順を取る
② 他のコンパイル単位にある定義の内容はわからんのでインライン化するためには翻訳単位の中に定義がある必要がある
③ ヘッダに関数定義を書きたい
④ ヘッダに定義を書くと ODR 違反やろ
⑤ じゃあ ODR の例外を設けよう。 inline って付けたら ODR の例外な!
2022/05/21(土) 18:53:36.34ID:0jWT+RR4
>>995

>>995 でいう定義は宣言に置き換えるべきでは?
ODR はあくまでも定義の話であって、宣言の話ではないかと考えます、私の勘違いでしょうか?

実装的には inline のついた関数定義が外部にリンクされる可能性があれば、すなわち extern な iniline 関数があれば、リンクのためのコード体を、各所に inline に展開されるコード体とは別に(こっそり)用意しておく、見たいな感じで十分に実装可能ですね
2022/05/21(土) 19:24:52.72ID:JD6rd3hb
>>996
外部に見せる用の実体のある定義は実際に用意される実装が多いと思う。
でも、その外部では実体を参照することは出来てもインライン化できないよね、各翻訳単位で定義が存在する必要があるよねということを言ってる。

その上で現在では LTO が普及したのでどうでもよくなったけど。
2022/05/21(土) 20:03:09.89ID:0jWT+RR4
>>997
なるほど、やっと理解しました

LTO: Link Time Optimization ですか‥‥、トラブルの元で胡散臭いと思っている私は古い人なんでしょうね‥‥、.obj がコンパイラ固有になるのも嫌ですし
2022/05/21(土) 20:12:03.42ID:kYXfaM+5
海外の専門用語はわかりにくいのう
日本風にリンオプとか略してくれればいいのに
イニシャリズムみたいな言い方だとなんて言うんだろ
2022/05/21(土) 20:15:04.92ID:0jWT+RR4
>>999
村上龍の「5分後の世界」では、略語は使うな、ちゃんと元の言葉を使え、と教育されていますね
ジョージ・オーウェルの「1984」では、略語は謀略的な意味で使われる(小説末尾の appendix: New Speak 解説のカテゴリーB)ようですね

これらに影響されて、略語を連発するのは望ましくないという言語観を私は持っていますが
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 36日 11時間 35分 33秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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