こんばんは。
「要素数がかなり大きくなりそうだか、要素となる値自体は大して大きくない(せいぜい2、3ケタ)」というような状況で、メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?
あと、こちらはついでで良いのですが、shortの使い時が分かりません。どんな場面で使われるのでしょうか?また、charを文字でなく1Byteの整数型として扱かう場面はありますか?
質問が多くてすみません、後半の質問はついでなので無視してもらっても構いません。宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答8件
2
他の回答で見られなかったことで思い当たることについて書いていきます
shortやcharは構造体の実際のデータサイズを抑える上で重要な役目があります。
構造体を用いている場合データ型のアラインメントを考えなくてはいけません。
例えば、下記の構造体は一般的には8バイトです。
struct sample{ char a; int b; }
C#では構造体は16バイト以下にしよう、という指針があったりします。
単に小さい方が良いというのももちろんありますが、そういう時に、最も小さく、欲しい情報を持てるだけの構造体を設計したくなりますよね。
shortは単純にint1個分で2個持てますから、構造体を考える時には重要な役目を持ちます。
例えば、以下のようにRECTを定義すると構造体のサイズは2倍違いますよね。
struct RECTsmall { short x; short y; short height; short width; } struct RECTlarge { int x; int y; int height; int width; }
データ型のアラインメントでぐぐってみてください。
short, floatは特にディスプレイ上に描画するプログラムで使われます。
charを使うデメリットは単体のアプリケーション内ではありませんが、他のツールとやり取りしようとすると混乱を招く場合があります。
例えばC#のcharはUTF-16の1文字、つまり2バイトです。
C++からC#へchar配列を移そうと思ったら、その型はchar[]
じゃなくbyte[]
になったりします。
もちろん、正規手順として文字列を受け渡している場合にはこの限りじゃないけど、文字以外でchar型を使うとそういうマーシャリングの混乱を招く時はあります。
投稿2017/05/16 02:50
総合スコア1593
2
こんにちは。
メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?
サイズの異なる整数型が用意されているのは、正にそのような目的です。
デメリットはオーバーフローに要注意ですね。
Windowsの16ビット時代に16ビットで表現していた値が小さすぎでみんな苦労しました。一度決めた後、変更しづらい値について小さな領域しか割り当てないと、10年後20年後に苦労するということはよくあることです。
shortの使い時が分かりません。
小さな値しか表現しない時にint型が勿体無いような時使うことはあります。
でも単体で使う時はあまりメリットはないです。やはり配列のように多数定義する時に効果があります。・・・①
他のソフトとデータをやり取りする時も使います。無駄にファイル・スペースや通信のペイロードを使わないようにする意味なので、結局①と同じですね。
また、charを文字でなく1Byteの整数型として扱かう場面はありますか?
どちらかと言うとunsigned charを使う場合が多いように思いますが、ケースバイケースです。char型は符号の有無が処理系で異なり、かつ、メジャーな処理系のデフォルトは符号付きなので意外にはまります。でも、unsigned charにすると安易にchar型を受け取るような関数があるとちょっと面倒です。
ちなみに、C++はchar, unsigned char, signed charを全て文字や文字列として扱うようです。(usngined charは数値として扱ってほしかった。...)
投稿2017/05/15 15:30
総合スコア23274
0
要素数がかなり大きくなりそうだか(中略)intの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?
なりえます。なりえる、と可能性を示唆する表現を用いたのは、ならない場合もあるからです。
私が最初にプログラムを覚えたのは親父の使っていたMicrosoft Quick C 2.0でしたが、その環境では、short型はint型と全く同じ大きさでした。
他にも、特殊な環境では、charもshortもintも全て同じ、ということがあります。
しかし、大多数の環境では、charやshortを配列に利用すれば、容量削減になります。
配列以外で用いた場合は、容量削減になるとは限りません(構造体の中など)。
デメリットは、実行時間のロスが発生する可能性、可読性が多少落ちることでしょうか。
CPUが得意な単位を無視するので、若干のロスが発生する可能性があります(環境次第)。
あと、shortはともかく、charは「通常」、文字を扱うために用いられる型なので、コードの読み手に、余計な神経を使わせてしまいます。多くの方がおっしゃるようにbool、int_8などの表現を用いたほうがよいと思います。
投稿2017/05/16 02:34
総合スコア1722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?
解決法になります。
次の回答につながりますが、使用する値の範囲に合わせた型を選択することは、正しいコーディングだと思います。
デメリットは特にないです。
shortの使い時が分かりません。
shortに限らず、charもintもlongもfloatもdoubleも、それぞれに範囲があります。
charなら-128~127、shortなら-32768~32767など。
参考
最初の回答にも書きましたが、想定される値の範囲に合わせた型を選択することは正しいコーディングだと思います。
値が0~255までしかありえない場合にunsigned charを選択しておきます。
その変数にコーディングミスで256を代入した場合、コンパイルのタイミングで警告が出るので、事前にバグを防ぐことができます。
といった理由で、メモリ削減以前に、プログラマが明示的な書き方をすることでよりよいコードになると思います。
逆にメモリが豊富にある時代ですので、思わぬバグを防ぐために、あらかじめintやlongを選択するという考え方もありますが・・・。
業務で使うようなコードでなければこれもありかと思いますが、やはりきちんとしたプログラムにはきちんと型を選びたいものです。
charを文字でなく1Byteの整数型として扱かう場面はありますか?
普通にあります。
むしろこの使い方の方が多いかもしれません。
例えば次のようにフラグに用いたりします。
char flag; // 0 or 1
投稿2017/05/16 00:28
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
理屈の上ではサイズの小さい変数の方が省メモリであるだろうとは思います。が、意識したことはほとんどありません。これくらいならコンパイラの自動最適化のカバー範疇でしょう。むしろ、互換性を保つ用途に使うイメージがあります。
ただ、学生時にこれと似たようなアイディアを用いて省メモリプログラミングでグラフ探索アルゴリズムを実装したことがあります。博士課程の先輩のテーマともされていた(当時としては)大規模ネットワーク探索の困難課題だったのですが、**「探索アルゴリズムの効率化に関わらず省メモリプログラミングで作ったら簡単に解けるものであった」**という結論でして、この件を発表したら教官や先輩方にズッコケられました。メモリ管理も盲点になりがちですが、重要な課題ではあります。
投稿2017/05/15 15:52
総合スコア4853
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そのintは何ビットですか?
投稿2017/05/15 15:10
総合スコア102
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。