توی ++C نوع های داده ای (Datatype ها ) مثل int , float , char , .... وجود دارن که هرکدوم اندازه مشخصی دارن .
sizeof اندازه این نوع ها رو بهتون برمیگردونه . اگر از یک کلاس sizeof بگیرید ، اندازه مجموع نوع های داده ای رو بهتون میده .
ولی در مورد اشاره گر ها داستان جدایی هست .
جواب توی لینک stackoverflow.com هم درسته هم غلط .
درسته به دلیل اینکه مثلا شما با new میخواهید ۹ بایت حافظه بگیرید و new از تابع ()malloc حافظه رو درخواست میکنه .
و اینکه شما دارید از کدوم Implementation ای از malloc استفاده میکنید تعیین میکنه که حافظه چطور اختصاص بگیره .
( پیاده سازی توابع ()malloc و ()free و realloc متفاوت هست . مثلا کتابخونه GNU C از مدیریت حافظه ی ptmalloc2 استفاده میکنه .
کتابخونه ی MSVCRT رو یادم نیست که از کدوم مدیریت حافظه استفاده میکرد . مدیریت حافظه ها یی مثل tcmalloc و nedmalloc و jemalloc و ... هم وجود دارن که پیاده سازی برای ()malloc هستند )
و اینطوری Memory Allocator ها اندازه درخواستی شما رو Align میکنن ( برای بالابردن Performance ) و مثلا اندازه درخواستی شما رو که ۹ بوده رو به ۱۶ تبدیل میکنن . پس شما اگر مثلا ۹ تا حروف رو درخواست کرده بودید . درواقع به شما بلاکی به اندازه ۱۶ حروف میده ( به دلیل Alignment ) . پس بلاک شما ۱۶ بایتی هست نه ۹ بایتی .
و غلطه بخاطر اینکه اطلاعات مربوط به بلاکی که ایجاد شده رو پشت بلاک ایجاد شده قرار میدن (مثل اندازه و موارد دیگه ) .
که در مواقع آزاد کردن حافظه Memory Allocator اندازه بلاک رو داشته باشه تا بتونه بلاک رو آزاد کنه .( که نهوه ذخیره Meta های یک بلاک
در هر پیاده سازی متفاوت هست )
درواقعا اون حافظه ی Stack هست که اندازه ی هر متغییر داخلش دخیره نمیشه . در مورد Heap اینطور نیست . Heap نیاز به سازمان دهی خیلی قوی داره .
شما متونید با به سادگی با ایجاد یک ساختار ساده تعداد آرایه رو هم برای خودتون نگه داری کنید .
مثلا :
#include <iostream>
using namespace std;
struct Array
{
size_t count;
short* items;
};
template <typename T>
class Array2
{
public:
size_t count;
T* items;
};
int main ()
{
Array a = { 10 , new short[10] };
Array2<float> b { 30 , new float[30] };
size_t i = 0;
for(i = 0;i < 10;i++)
a.items[i] = i * i;
for(i = 0;i < 30;i++)
b.items[i] = i * 3.14f;
for(i = 0;i < 10;i++)
cout<<a.items[i]<<endl;
for(i = 0;i < 30;i++)
cout<<b.items[i]<<endl;
return 0;
}
شما تو طول برنامه تعداد آرایه ها رو داخل متغییر های count دارید .