تفاوت std::list با std::forward_list؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تفاوت std::list با std::forward_list؟

+3 امتیاز
سلام به دوستان. تفاوت std::list با std::forward_list تو چیه . ممنونم
سوال شده بهمن 25, 1392  بوسیله ی مهناز محجوبی (امتیاز 79)   2 8 12
دوباره تگ گذاری شد دی 30, 1393 بوسیله ی BlueBlade

2 پاسخ

+4 امتیاز
 
بهترین پاسخ

همون طوری که -7 گفت list لیست پیوندی 2 طرفست ولی forward_list یک طرفه

از نظر سرعت forward_list یک مقدار خیلی جزیی زمان پر شدن سریع تره

ولی   از نظر حجم مصرفی نمیشه گفت همیشه forward_list  فضای کمتری رو اشغال می کنه .

توی تست هایی که انجام دادم برای  50 میلیون عنصر توی سیستم من نتیجه به این شکل شد :

//long long
//             size(mb)    time
//forward list 1157.3      2360
//list         1157.3      2450


//char  
//              size(mb)  time
//forward list  773       2185
//list          1157      2400

همون جوری که مشخصه از نظر سرعت تفاوتشون خیلی خیلی کمه .

از نظر فضای مصرفی هم بستگی داره داخلشون چی ریخته باشین

دلیلی که توی کد بالا  فضای مصرفی با وجود عوض کردن char با long long فرقی نکرده :

  • forward_list<char> node: sizeof(void*) + sizeof(char) == 5, which the memory allocator will round up to an 8 byte allocation.
  • forward_list<long long> node: sizeof(void*) + sizeof(long long) == 12, which the memory allocator will round up to an 16 byte allocation.
  • list<char> node: 2 * sizeof(void*) + sizeof(char) == 9, which the memory allocator will round up to an 16 byte allocation.
  • list<long long> node: 2 * sizeof(void*) + sizeof(long long) == 16, which the memory allocator won't round since 16 is already a multiple of 8


یعنی این که سایز همیشه کمتره درست نیست خیلی وقت ها سایز مورد استفاده هم دقیقا برابره .

 

کد تست :

#include <iostream>
#include <list>
#include <forward_list>
#include <windows.h>

int main()
{
    LARGE_INTEGER start_;
    LARGE_INTEGER end_;
    LARGE_INTEGER freq;

    QueryPerformanceFrequency(&freq);
    std::list<long long> list;

    QueryPerformanceCounter(&start_);
    for(long long i=0;i<50000000;i++)
        list.push_front(i);
    QueryPerformanceCounter(&end_);


    std::cout<< (end_.QuadPart - start_.QuadPart) / (freq.QuadPart / 1000) <<"\n";
    std::cin.get();
}

 

پاسخ داده شده اسفند 9, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده شهریور 26, 1393 بوسیله ی BlueBlade
خط آخر رو تبدیل std::cin.get() بکنید. الان برای list با توجه به کدی که نوشتید 40 دقیقه منتظر بودید که خروجی بگیرید؟ توی کدتون چیزی به نام size نمی بینیم. محاسبه size به چه نحوی بوده؟
زمان ها بر حسی میلی ثانیه هست پس میشه ۲ ثانیه . اگر قرار باشه این عملیات ساده ۴۰ دقیقه طول بکشه که دیگه کامپیوتر نیست ماشین حسابه :)
این سوال مال ۶ ماهه پیشه اصلا یادم نیست  کد size دقیقا چی بود
میگردم اگر کدش رو پیدا کردم میزارم
این کد شما رو وقتی توی ویژوال استدیو اجرا می کنم خطا میده زمانی بیش از 2 ثانیه طول میکشه که خطا میده. تقریبا حدود یک دقیقه که برنامه اجرا است خطای زیر رو میده و نمی تونم خروجی بگیرم (اصطلاحا برنامه break میشه)
Unhandled exception at 0x758CC42D in Project1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0035F02C.
علت این خطا چیه؟
توی مد 64 بیتی بیلد کنید .
یا enable large address رو فعال کنید .
بخاطر این که دارید بیشتر از 2 گیگ حافظه می گیرید اون ارور داده میشه.
+3 امتیاز

فرقشون اینه که std::list ها لیست های پیوندی دو طرفه هستند . ولی std::forward_list ها لیست های پیوندی یک طرفه هستند .

وقتی شما نیازی به حرکت دو طرفه در لیست ندارید بهتره که از std::forward_list (بخاطر گرفتن حافظه ی کمتر) بجای std::list استفاده کنید.

پاسخ داده شده اسفند 9, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
...