オブジェクト指向ってメモリ効率が悪くないでしょうか??
オブジェクト指向についてまだ理解が不十分なので使い方がイマイチよくわかっていません。
「メモリ効率が悪いのでは??」と思ったのはメソッドです。(メンバ関数)
(ここで言うメソッドと関数は同じものとしますね。)
以下にテストした簡単なサンプル。
#include<iostream> class test{ public: void func(int&& y){ std::cout << y << std::endl; }; }; class same_func{ public: void func(int&& y){ std::cout << y << std::endl; }; }; class same_func_keishou : public same_func{ public: void other_func(int&& x){ std::cout << x << std::endl; }; }; int main(){ test check; check.func(1); same_func same; same.func(2); same_func_keishou keishou; keishou.func(3); keishou.other_func(77); return 0; }
以下、逆アセンブルした関数呼び出し部分です。
e8 b4 00 00 00 callq 980 <_ZN4test4funcEOi> 8e1: e8 d6 00 00 00 callq 9bc <_ZN9same_func4funcEOi> 8fb: e8 bc 00 00 00 callq 9bc <_ZN9same_func4funcEOi> 915: e8 de 00 00 00 callq 9f8 <_ZN17same_func_keishou10other_funcEOi>
全く同じ定義の関数が所属しているクラスが異なるだけで、2つの関数のための領域がメモリ上に確保されることになります。
「継承している場合は複数定義されることはない」ということのようです。
以下のような質問を見つけました。
C++でのクラスのメンバ関数が占める容量が知りたい
All instances share the same member function code.
まぁ・・・これはそうでしょうね。
インスタンスごとに異なる関数として定義されては、流石に効率が悪すぎます。
継承は親クラスの機能を受け継ぎますが、これは開発効率を上げるための優しさ的仕様であり、継承の本質はインターフェイスなのです。もしあなたが継承の本質を「機能の受け継ぎ」と勘違いした途端、オブジェクト指向はあなたに牙を剥くでしょう。
むむ??
自分は今まで「継承」を「同じ関数を再度作るの面倒だから」・・・とか「この関数があれば便利だから」という理由で継承を利用していました。
ところが、この機能を受け継ぐという考え方はどうもダメみたいです。
(同じメソッドを使う場面が結構ありました。)
そうすると、同じメソッドもしくはif文などの条件分岐を少し加えるだけで、1つの関数にまとめられるような場合、どのようにしてプログラムを作れば良いのか??という疑問があります。
これは、C++に限った話ではないですね。
アプリケーション開発みたいに、最近のメモリは大量なのでこれくらいは大丈夫・・・という気がしますが・・・
OS開発や組み込み系の低レイヤーでは、同じ関数が別の物として複数定義されているのは、ちょっと効率が悪いですよね??
「塵も積もれば山となる」みたいな・・・
STLにそのようなメソッドがあるかどうか不明なのですが・・・
std::vector と std::stringについて試しに調べてみましたが、全くの別物でしたね。
//std::vector::push_back() #if __cplusplus >= 201103L void push_back(value_type&& __x) { emplace_back(std::move(__x)); } //std::string::push_back() void push_back(_CharT __c) { const size_type __size = this->size(); if (__size + 1 > this->capacity()) this->_M_mutate(__size, size_type(0), 0, size_type(1)); traits_type::assign(this->_M_data()[__size], __c); this->_M_set_length(__size + 1); }
ライブラリなどでこの・・・「同じ関数が別物として定義される」ものを作るとメモリ効率が下がりますよね。
特に、C++のような低レベルのプログラミングをジャンジャンできるような言語だとメモリを無駄遣いするわけにはいかないかと思います。
STLを眺めていて以下のような記述を目にしたことがあります。
(ちょっと違うかもしれません。)
push_back(){ _Base::push_back(); }
うーーーん。ちょっと微妙。
カプセル化に反する??
何度もよく使うようなメソッドをまとめといて、それを呼び出している感じですね。
これだと、C言語でオブジェクト指向プログラミングをしているのとあんまり変わらないような気がします。(Linux Kernelみたいな)
同じメソッド、あるいはかなり近い、似たようなメソッドを使いまわしたい場合、どうすればよいのでしょうか?
メモリ効率のモヤモヤ感とオブジェクト指向の考え方がちょっと難しいですね。
ポリモーフィズムなどはメモリを食いそうで仕方がないとという感じがしますが、Cに比べるとちょっとメモリ効率が悪い感じですかね。
分かる方教えてください。
環境は、Linux g++ でやりました。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/17 04:18
2018/07/17 04:21
2018/07/17 05:02
2018/07/17 05:28
2018/07/17 05:38 編集
2018/07/17 05:39
2018/07/24 13:23
2018/07/24 17:58