C++で実行時にメモリ使用量を取得する方法【Linux環境向け】
C++プログラムでは、仮想メモリ使用量や常駐セットサイズ(RSS:Resident Set Size)といったメモリ使用量の統計情報を、実行時に動的に取得できます。これらの情報を取得するには、OSが提供するシステムライブラリや特殊なファイルを利用します。ただし、取得方法はオペレーティングシステムによって異なるため、本記事ではLinux環境を例に解説します。
/proc/self/statからメモリ情報を読み取る仕組み
Linuxでは、/proc/self/statファイルからカレントプロセス自身に関する詳細情報を取得できます。ここから以下の2つの指標を読み取り、メモリ使用状況を把握します。
- 仮想メモリ使用量(vsize):プロセスに割り当てられた仮想アドレス空間の合計サイズ(バイト単位)
- 常駐セットサイズ(rss):物理メモリ上に実際にロードされているページ数
注意点として、rssはページ数で記録されているため、実際の使用量(KB)に変換するにはシステムのページサイズを掛ける必要があります。ページサイズはsysconf(_SC_PAGE_SIZE)関数で取得できます。
コード例
#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void mem_usage(double& vm_usage, double& resident_set) {
vm_usage = 0.0;
resident_set = 0.0;
ifstream stat_stream("/proc/self/stat",ios_base::in); //procディレクトリから情報を取得
//情報を受け取るための変数を用意
string pid, comm, state, ppid, pgrp, session, tty_nr;
string tpgid, flags, minflt, cminflt, majflt, cmajflt;
string utime, stime, cutime, cstime, priority, nice;
string O, itrealvalue, starttime;
unsigned long vsize;
long rss;
stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
>> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
>> utime >> stime >> cutime >> cstime >> priority >> nice
>> O >> itrealvalue >> starttime >> vsize >> rss; //残りの項目は不要
stat_stream.close();
long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // x86-64では2MBページに設定される場合がある
vm_usage = vsize / 1024.0;
resident_set = rss * page_size_kb;
}
int main() {
double vm, rss;
mem_usage(vm, rss);
cout << "Virtual Memory: " << vm << "\nResident set size: " << rss << endl;
}
実行結果
Virtual Memory: 13272 Resident set size: 1548
コードのポイント
mem_usage()関数では、まずifstreamを使って/proc/self/statを開きます。このファイルの各項目はスペース区切りで並んでいるため、抽出演算子(>>)を連結して順番に読み込みます。必要なのは後半のvsizeとrssだけですが、先頭の項目もすべて読み飛ばさずに受け取る必要がある点に注意してください。
その後、vsizeを1024で割ってKB単位の仮想メモリ使用量に変換し、rssにページサイズ(KB)を掛けて常駐セットサイズを求めています。この手法は追加ライブラリ不要で手軽に使える一方、Linux専用であるため、クロスプラットフォーム対応が必要な場合はWindowsのAPIなどOSごとの実装を用意しましょう。
-
C++とOpenCVを使って線を描画する方法
OpenCVで線を描画するには、始点と終点の2つの座標が必要です。さらに、線を描くためのキャンバス(描画領域)も用意しなければなりません。線を描画するために必要な要素OpenCVでは、キャンバスとして機能するのが行列(Mat)です。この行列に対して、線の始点と終点を定義し、加えて以下の情報も指定します。線の色線の太さつまり、OpenCVで線を描くには、行列・2つの点・色・線の太さという4つの要素を宣言しておく必要があります。必要なヘッダーファイルOpenCVで線を描画するには、<imgproc.hpp>ヘッダーをインクルードします。これは、line()関数がこのヘッダー内で定義され
-
C++プログラムから外部アプリケーション(メモ帳など)を起動する方法
この記事では、C++プログラムを使ってメモ帳(Notepad)などのサードパーティ製アプリケーションを起動する方法を解説します。実装は非常にシンプルで、コマンドプロンプトで使うコマンドをそのままC++から呼び出すだけで実現できます。ポイントとなるのは、標準ライブラリの system() 関数です。この関数の引数にアプリケーション名(コマンド)を文字列として渡すと、OSがそのコマンドを実行し、対応するアプリケーションが起動します。サンプルコード#include <iostream> using namespace std; int main() { cout <<