2019年3月8日金曜日

【C++】new と malloc の挙動を確認してみた

概要

C++ でメモリを確保する方法にはいろいろとあります
代表的な方法に「new」を使う方法と「malloc」を使う方法があります
今回はそれぞれでメモリを確保してサイズを確認してみました

環境

  • CentOS7 7.5.1804
  • g++ 4.8.5-28

比較するコード

#include <stdio.h>
#include <iostream>
#include <malloc.h>

int main() {
  uint *buf1 = new uint[512];
  printf("%lu\n", malloc_usable_size(buf1));
  uint *buf2 = new uint[512 * 128];
  printf("%lu\n", malloc_usable_size(buf2));
  uint *buf3 = (uint *)malloc(512 * sizeof(uint));
  printf("%lu\n", malloc_usable_size(buf3));
  uint *buf4 = (uint *)malloc(512 * 128 * sizeof(uint));
  printf("%lu\n", malloc_usable_size(buf4));
  return 0;
}

ビルド

  • g++ -std=c++11 -o sample sample.cpp
  • ./sample

結果

2056
266224
2056
266224

考察

new の [512] の部分と malloc の (512 * sizeof(uint)) の部分が同じ値になれば確保されるメモリのサイズも同じのようです
sizeof(uint) は 4 になるので 512 * 4 = 2048 のメモリが確保されているのが確認できます

もし new と malloc で同じサイズのメモリ領域がほしい場合ですが
new の場合はほしい分のサイズをただ指定すればいいのですが malloc の場合は sizeof(T) 分追加で掛け合わせなければいけないのがポイントかなと思います

最後に

new と malloc で同じメモリ領域を確保する方法を確認しました
ちなみに確保したメモリ領域は解放しないと OOM になります
new は delete で開放し、malloc は free で開放することができます

0 件のコメント:

コメントを投稿