【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/07/18(火) 07:07:27.20ID:vzMDiUgd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
2017/08/03(木) 00:48:42.44ID:cUZMqwjs
>>257
違うの?
2017/08/03(木) 01:02:12.67ID:cUZMqwjs
あ、動的配列じゃなくてヒープのアドレスとってるだけよということかな
2017/08/03(木) 01:02:16.06ID:YO3k3fE8
C++11のemplace_backを忘れてた。コピーせずに、vector内部で直接構築されるんだった。
2017/08/03(木) 07:14:24.41ID:jHHnzd5n
>>266
「アドレス」でなく「ポインター」という言葉を使っているので正しくない
要素数1の動的配列の先頭要素へのポインター
270デフォルトの名無しさん
垢版 |
2017/08/03(木) 13:14:53.27ID:vWCSRcUD
>>248
コピーコンストラクタ無しのm_pcが同じアドレスを参照している確認取れました。
丁寧な解説ありがとうございました。
2017/08/03(木) 14:40:42.21ID:xqHGpC9q
ふえぇぼうよー先生の本凄く読みずらいよ・・・
2017/08/03(木) 16:53:01.55ID:2WeFShGG
>>241
言いたいことはわかるけど
キャストしたところで何もしないぜ?
2017/08/03(木) 16:58:53.44ID:2WeFShGG
何もしないってのは吐き出されるコードが不変て意味ね
個人的にはキャストするけど
2017/08/03(木) 20:14:02.94ID:Wy5AX0em
intが32bitな64bit環境下だとして
printfの可変長引数で32bit整数を64bitに自動拡張するときの
拡張のされ方が変わるんじゃね?
ただし%uによって32bit分しか見に行かないから無視してよいけど
コード不変とはならないんじゃね?
2017/08/03(木) 20:21:13.08ID:D1Re6UdQ
%z と %d の差ですかい?
2017/08/03(木) 20:24:42.71ID:Wy5AX0em
いや、64bitに自動拡張してスタックに積む際に
2017/08/03(木) 20:28:36.06ID:D1Re6UdQ
int が32bit なら 可変長引数部でスタックに詰むとき
暗黙で 64bit に自動拡張はやらんのじゃないの?
2017/08/03(木) 21:31:57.89ID:2WeFShGG
やったら破綻する
2017/08/03(木) 22:25:13.00ID:2WeFShGG
嘘ですサーセン
2017/08/03(木) 22:54:52.47ID:84Bc5dj3
>>273
そんな保証はないよ
2017/08/03(木) 23:29:16.77ID:2WeFShGG
保証は無いね
x64の場合でもキャストしようがしまいが0拡張になるけど
差が出るとしたらどんな場合?
2017/08/03(木) 23:48:26.53ID:Wy5AX0em
常に0拡張は信じがたい
負数の時おかしくなるだろ・・・
2017/08/03(木) 23:49:27.73ID:2WeFShGG
intが32bitの処理系の話ね
32bitのintを64bitに符号拡張するのはダメでしょ
2017/08/04(金) 07:09:12.01ID:KzbqP8qx
>>282
>負数の時おかしくなるだろ・・・
ならねーよ
printfは32bitしか取り出さねーんだから
2017/08/04(金) 08:30:27.75ID:oD3njs5y
64bit で引き出したうえで 32bit しか採用しないのか
32bit で引き出すだけなのか

後者は2個目いこう狂うわけ
2017/08/04(金) 08:46:19.49ID:SS0ANIEQ
64bitに自動拡張してスタックって、x64はpush eaxしたら8バイトpushされんの?
2017/08/04(金) 08:47:48.89ID:Q7buFUOM
8、16でも前者でしょ
2017/08/04(金) 08:48:26.38ID:Q7buFUOM
push raxになる
2017/08/04(金) 08:53:09.50ID:Q7buFUOM
というわけでビッグエンディアンは糞である
2017/08/04(金) 09:16:15.84ID:SS0ANIEQ
int32にしてもスタックやキャッシュは倍の速度で消費されるのかよ。
2017/08/04(金) 09:27:05.86ID:Q7buFUOM
キャッシュは確認してないけど
スタックはポインタ幅で消費されるね
2017/08/04(金) 09:31:06.85ID:Q7buFUOM
実装依存だとは思う
VisualStudioではそうだっつーだけ
2017/08/04(金) 12:56:51.39ID:+PWQy8Ni
実装依存じゃない
x86-64の仕様
2017/08/04(金) 12:57:32.28ID:+PWQy8Ni
普通、引数の受け渡しはスタックじゃなくてレジスタ使うけど
2017/08/04(金) 13:15:35.79ID:SS0ANIEQ
呼出規約については知らないのか。
2017/08/04(金) 14:31:21.93ID:PHBV9/TP
呼び出し規約は実装依存ではないけどアーキテクチャ依存でもないよ
そして、引数の受け渡しにレジスタをどう使うかというのは呼び出し規約と関係なく実装依存
さらに、引数はスタックに積まれるし、それはレジスタどうのこうのとは関係のない話
2017/08/04(金) 14:49:43.29ID:SS0ANIEQ
何を言ってるかさっぱり意味が分らないや。
2017/08/04(金) 14:56:40.96ID:oD3njs5y
引数を { 頭から 末尾から } { レジスタ スタック } につんで
つんだ引数の巻き戻しを { 呼び出し側 呼ばれた側 } で行う
2017/08/04(金) 18:15:41.13ID:fFEm/UGM
>>296
呼び出し規約がアーキテクチャーに依存しないなんてことはあり得ない
2017/08/04(金) 18:17:54.06ID:5d5G+9Ac
>>296はどうしようもない低能
その低能にマジレスみっともない
301デフォルトの名無しさん
垢版 |
2017/08/04(金) 18:24:58.70ID:gG3ajqK7
>>296
レジスタ少ないx86ではスタックだが、x86_64では第1引数から第7引数までキッチリどのレジスタに入れろって決まってる。
これをアーキ依存と言わずしてなんと言うのか。
2017/08/04(金) 19:06:39.89ID:gMHFD1Iy
その規約をやぶって、全部スタックに乗せる、という呼び出し規約を自分で実装していいですか?
2017/08/04(金) 19:13:12.05ID:07Vnvfe5
規約は他のプログラムと協調するためだけのもの。
他のプログラムと絡まないんなら好きにすればいい。
304デフォルトの名無しさん
垢版 |
2017/08/04(金) 19:20:42.44ID:gG3ajqK7
>>302
別にAPI単位の規約だから好きにすれば良いけど、スタックだと32bitよりメモリ喰うし増えたレジスタ活かさずメモリとやり取りだから関数呼び出しが多いほど速度に差が出るよ。
2017/08/04(金) 19:22:07.45ID:PHBV9/TP
>>301
勉強になったわ
2017/08/04(金) 19:37:44.52ID:9p5UOFbs
アセンブラで書くならともかく、
既存のコンパイラで自己流の呼び出し規約を使うって可能なのかな。
307デフォルトの名無しさん
垢版 |
2017/08/04(金) 19:43:40.82ID:gG3ajqK7
レジスタとか出てる時点でアセンブラやけどね。
高級言語からは同じに見えてもアセンブラからAPI呼ぶ時に混乱の元だから規約になってるんだろう。
2017/08/04(金) 19:47:10.77ID:LmZvF4Bx
>>306
自己流の呼び出し規約を使うのは自己流のコンパイラだけだろ
それが既存かどうかは知らんけど
2017/08/04(金) 19:49:02.44ID:fFEm/UGM
アセンブラでリーフ関数を呼ぶとき位だな
自己流が役立つのは
2017/08/04(金) 20:12:22.52ID:B2ZVqR3g
pro*cって何のために存在するの?
普通にc言語のコードにSQL埋め込めばよくね?
2017/08/04(金) 20:15:41.79ID:d/io8eQ7
>>301
第6引数までじゃね? 普通は rdi rsi rdx rcx r8 r9
rax も浮動小数の個数に使うが
windowsだけは rdx rcx r8 r9 だった気がする。
2017/08/04(金) 20:27:46.30ID:fFEm/UGM
floatやdoubleが混ざれば
2017/08/04(金) 23:32:26.83ID:ajRTrwbv
>>310
普通はCにSQL埋め込むなんてできないだろ。
SQL文を送ってコンパイルする関数を呼んで実行する関数を呼んで結果を取得する関数を呼ぶので
かまわないならPro*Cなんて必要ない。

それにしてもなんで今頃Pro*Cなんだろうか。とっくに廃止されたかと思ってた。
2017/08/05(土) 01:02:35.26ID:wHnek147
よくわからないんだけどSQLと連動できるプログラム言語ってあるの?
2017/08/05(土) 01:36:09.75ID:AmDvMFkm
Transact-SQLとかのことか?
2017/08/05(土) 02:01:06.28ID:mmL6pr8y
Linq とか
2017/08/05(土) 13:32:17.23ID:9ltGhnE7
>>314
SQL埋め込みコボルが世の中に何百万行残ってるとおもってんだ
2017/08/05(土) 17:30:23.26ID:eD6LHYAo
>>293
そりゃそうか
失礼しました
2017/08/06(日) 15:44:19.07ID:4cVoKrwP
コボルかー
じゃjavaとかpythonとかC++やCで大量データを扱おうと思ったら何らかのアルゴリズムでデーターベース自作するしかないの?
それともそういう目的だとすべからくLinqとかつかってるの?
2017/08/06(日) 16:33:45.26ID:k6XOSsfa
ORまっぱ
2017/08/07(月) 00:24:32.53ID:9fB0IwUX
大量のデータを処理したいのならPLSQLとかのdb上で動作するやつじゃないの?
2017/08/07(月) 00:26:46.20ID:DdwwpY1/
DB操作用のクラスが標準ライブラリにあるから、その言語はSQLをサポートしてると思ってるのだろう。
2017/08/08(火) 21:38:02.52ID:9+bCDZAx
const char ex1[] = "test";
const char ex2[] = { 't', 'e', 's', 't', '\0' };
auto ex3 = "test";
auto& ex4 = "test";
auto&& ex5 = "test";

ググってみると、ex1とex2は完全に等価、ex3はconst char*?
ex4とex5はconst char[]だけどex1、ex2と等価ではない?
どういうことッスか?なんかよー分からんです。
2017/08/08(火) 21:44:21.88ID:RV4q7wps
変数名の上にマウスポインターを持って行く
ぐらいは試したのだろうか
2017/08/08(火) 22:10:21.09ID:FFmZneRO
誰もかれもがモダンな統合開発環境を使ってると思ったら間違いやで。
2017/08/08(火) 22:12:27.93ID:m3/ZcJyF
早くナウいモダンボーイになれよ
2017/08/08(火) 22:13:12.16ID:RV4q7wps
>>325
その通りだ
では
http://ideone.com/GtYLLG
この結果を見てわからなければ出家するしかない

ついでにex1,2は関数が実行される度に配列が作られる
2017/08/08(火) 22:16:15.22ID:m3/ZcJyF
配列への参照というのが分かりにくいね。
2017/08/09(水) 18:30:53.88ID:hewgQard
using F = void () &;
struct A { void f() & {} };
F A::*const &mp = &A::f;

参照もこのぐらい複雑になるとコンパイラーですら正しく実装できないものが出てくる
2017/08/09(水) 20:42:43.33ID:deJRgLks
初心者歓迎スレはいつから難読コードスレになったんだ?
2017/08/09(水) 23:21:19.78ID:HVjwey6J
難読禁止スレではないし
それより言語を断らずにc++限定の話すんなや
2017/08/09(水) 23:58:04.92ID:1RczvVHb
ぷらぷらは意図しない難読化しやすいよなぁ
2017/08/10(木) 00:19:15.22ID:iih/xgGV
おまえらは意図してドヤ顔でオナニーコード貼って理解できないなら出家しろとか言ってるからな。

初心者相手にマウンティングとか見てて恥ずかしい。
2017/08/10(木) 07:19:08.51ID:9leEGZbL
バカにマウンティングしてるお前や俺よりマシだろ w
2017/08/10(木) 07:42:54.68ID:0ifqJKrS
http://d.hatena.ne.jp/yupo5656/20060907/
この話ってグローバル変数の時だけと思っていいですか?
void f(){ const char g[] = "asdf"; }
だと毎回初期化する分、損になりそうに思うんですが
2017/08/10(木) 07:57:39.32ID:OxRJE4uH
普通は最適化されて何の問題もないだろうけど

組み込み用の一部の糞コンパイラとかで使う可能性があるなら書き換えておいた方が良いかもね
2017/08/10(木) 08:00:25.98ID:OxRJE4uH
極端に悪くなる可能性のあるコードにしない
汎用性のあるコードを書く時の基本

特定の環境だけならその環境でテストしてみればわかること
2017/08/10(木) 08:05:23.26ID:PWbZqU7d
>>335
だからstatic付けろって書いてあるっしょ
2017/08/10(木) 12:55:02.15ID:XSzwBP/X
リテラルに名前付けたいだけなら
auto&&var=リテラル
何も考えずこれでええw
2017/08/10(木) 13:19:12.39ID:eseR3mB4
せやろか
2017/08/10(木) 14:56:24.20ID:R7slyUqA
はいそうです
2017/08/10(木) 16:20:23.29ID:K3yW/cOR
もしかして#defineで定数用意するよりそっちの方がかっこいい?
2017/08/10(木) 16:58:59.12ID:R5q9oGzu
マクロ多用するとデバッグ面倒にならね?
2017/08/10(木) 16:59:23.11ID:9PTjWwFP
#define A 100 ←存在が害悪の化石老人
auto &&A = 100; ←ODRを考えない短絡思考
constexpr int A = 100; // ←ふつうの人
constexpr auto &&A = 100; // ←ちょっとヘンな人
2017/08/10(木) 18:17:00.74ID:OxRJE4uH
組み込みCだとdefineしか出来なかったりするんだよ
2017/08/10(木) 18:23:30.24ID:0YJhJ81N
>>344
ODR って何の略?
2017/08/10(木) 18:53:23.23ID:cpubt7xV
>>346
ODRとはOne Definition RuleのことでC++の重要なルールである。
Cの仮定義と異なりC++ではインライン関数やテンプレートを除き
「定義」が複数あってはならない。
この多重定義の禁止と一部の例外を定めたルールがODRと呼ばれる。
例えばauto && A = 100;が記述されたヘッダファイルを
二つの翻訳単位からincludeしたとすると
二つの翻訳単位でAが定義されることになりエラーとなる。
詳細は処理系のマニュアルを見よ。
2017/08/10(木) 19:40:58.66ID:1RrigXav
もしかしてヘッダファイルにconstexpr auto &&A = "lkjdslkjf";とか書くのって合法?
#define 名前 定数としてたやつは全部constexpr auto &&名前 = 定数で置き換えられる?
2017/08/10(木) 21:11:04.47ID:yu1iQyxx
>>348
内部リンケージなのでODRには違反しない
翻訳単位ごとに実体が異なるのでアドレスが異なると困る場合には使うべきでないが
これは旧来のstatic constやdefineでも変わらない
2017/08/11(金) 03:47:43.97ID:eOUFNbYQ
#define→enum→const→constexpr
定数書くのに変わり杉です
理想論いらないです#define溢れた現実世界見よ
2017/08/11(金) 08:37:53.72ID:NrUav3sg
>>350
老害の見苦しい言い訳乙
ディープラーニングとか言っても理解できないんでしょ?涙拭けよ
2017/08/11(金) 08:55:50.68ID:xt3khzo9
constexprにしたほうがいいものがconstになってるのは結構あるけど、defineなんてほぼ見ないけどな
2017/08/11(金) 11:58:39.97ID:vOciZ7Dc
>>351
Aで詐欺でもしてるんですか?
2017/08/11(金) 13:32:11.00ID:eZ0/1svY
さすがに #define は殺そう
2017/08/11(金) 14:16:58.81ID:Tw4iEl8C
組み込みのチープな世界を知らないんだな
2017/08/11(金) 14:29:14.52ID:Ngnf1AZe
知る必要すらない
2017/08/11(金) 14:37:28.25ID:Tw4iEl8C
リッチな環境限定のスレじゃないから
環境依存OK
2017/08/11(金) 14:39:12.01ID:Tw4iEl8C
知る必要がない人が大部分だろうが
ここはそういう人限定のスレではない
2017/08/11(金) 14:40:43.01ID:Tw4iEl8C
>>354 みたいなのを見ると、視野が狭いと思ってしまう
色々な事情で色々なコードがある
2017/08/11(金) 14:43:55.42ID:Tw4iEl8C
Cに移植する可能性がゼロであるコードをC++上で新規でdefineで書いてたら老害だと思う
2017/08/11(金) 15:18:06.60ID:BFfVWgAm
組み込みCだとstatic const使えてもアセンブリレベルで
即値にならないので#defineは常識
環境依存スレで多様性否定する奴は去れ
2017/08/11(金) 15:54:54.01ID:99wg1jHM
>>355
どこのコンパイラ使ってるか書いてみ
2017/08/11(金) 16:37:53.27ID:eZ0/1svY
>>361
だからそういうコンパイラを殺そうぜっていう話な
2017/08/11(金) 19:54:31.22ID:+jIwXf8Q
constとconstexprの違いがよくわからない
2017/08/11(金) 20:11:06.67ID:TX++PaV2
動的か静的かの違い?
■ このスレッドは過去ログ倉庫に格納されています