Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2014, 11:34   #11
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
Хорошо

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Код:
int world[500][2000];
Неэкономно. Можно уменьшить размер массива в 32 раза для машины x86 или в 64 раза для машины x64, если использовать для хранения нулей и единиц массив типа bool

Код:
bool world[4800][2400];
x86
Для int. 4800 * 2400 = 11520000 интов. 1 int - это 4 байта. 11520000 * 4 байта = 46080000 = 46 МБайт. Неужели не хватает памяти для 46 МБайт?

Для bool. 4800 * 2400 = 11520000 бит. 1 бит равен 1/8 байт. 11520000 / 8 = 1440000 байт= 1.4МБайт. В сравнении с предыдущим вариантом в 46 МБайт, как раз, в 32 раза

x64
Для int. 1 int - это 8 байт. 11520000 * 8 байт = 92160000 = 92 МБайт. Сколько у вас памяти всего?

Для bool остаётся также: 1.4 МБайт, но разница теперь составляет в 64 раза

Вроде так получается. Поправьте, если ошибся

Вот вам пример:
Код:
#include <iostream>

int main()
{
    bool arr[10][10];

    arr[0][0] = 1;
    arr[0][1] = 0;

    std::cout << arr[0][0] << " " << arr[0][1] << std::endl;

    return 0;
}

Огромное спасибо! хорошая идея! Тема закрыта!
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 11:35   #12
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Код:
int world[500][2000];
Неэкономно. Можно уменьшить размер массива в 32 раза для машины x86 или в 64 раза для машины x64, если использовать для хранения нулей и единиц массив типа bool

Код:
bool world[4800][2400];
x86
Для int. 4800 * 2400 = 11520000 интов. 1 int - это 4 байта. 11520000 * 4 байта = 46080000 = 46 МБайт. Неужели не хватает памяти для 46 МБайт?

Для bool. 4800 * 2400 = 11520000 бит. 1 бит равен 1/8 байт. 11520000 / 8 = 1440000 байт= 1.4МБайт. В сравнении с предыдущим вариантом в 46 МБайт, как раз, в 32 раза

x64
Для int. 1 int - это 8 байт. 11520000 * 8 байт = 92160000 = 92 МБайт. Сколько у вас памяти всего?

Для bool остаётся также: 1.4 МБайт, но разница теперь составляет в 64 раза

Вроде так получается. Поправьте, если ошибся

Вот вам пример:
Код:
#include <iostream>

int main()
{
    bool arr[10][10];

    arr[0][0] = 1;
    arr[0][1] = 0;

    std::cout << arr[0][0] << " " << arr[0][1] << std::endl;

    return 0;
}
Спасибо огромное! Хорошая идея! Темя закрыта!
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 11:37   #13
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Код:
int world[500][2000];
Неэкономно. Можно уменьшить размер массива в 32 раза для машины x86 или в 64 раза для машины x64, если использовать для хранения нулей и единиц массив типа bool

Код:
bool world[4800][2400];
x86
Для int. 4800 * 2400 = 11520000 интов. 1 int - это 4 байта. 11520000 * 4 байта = 46080000 = 46 МБайт. Неужели не хватает памяти для 46 МБайт?

Для bool. 4800 * 2400 = 11520000 бит. 1 бит равен 1/8 байт. 11520000 / 8 = 1440000 байт= 1.4МБайт. В сравнении с предыдущим вариантом в 46 МБайт, как раз, в 32 раза

x64
Для int. 1 int - это 8 байт. 11520000 * 8 байт = 92160000 = 92 МБайт. Сколько у вас памяти всего?

Для bool остаётся также: 1.4 МБайт, но разница теперь составляет в 64 раза

Вроде так получается. Поправьте, если ошибся

Вот вам пример:
Код:
#include <iostream>

int main()
{
    bool arr[10][10];

    arr[0][0] = 1;
    arr[0][1] = 0;

    std::cout << arr[0][0] << " " << arr[0][1] << std::endl;

    return 0;
}
Спасибо большое! Тема закрыта!
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 11:38   #14
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Спасибо большое! Тема закрыта!
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 15:20   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Код:
Для bool. 4800 * 2400 = 11520000 бит. 1
С чего вы взяли, что bool - это бит?
Вот вы привели пример - заодно вставьте в него вывод размера массива sizeof(arr), результат вас может удивить.
waleri вне форума Ответить с цитированием
Старый 22.10.2014, 17:06   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
С чего вы взяли, что bool - это бит?
Вот вы привели пример - заодно вставьте в него вывод размера массива sizeof(arr), результат вас может удивить.
Большое спасибо! Вот это да! Я недодумался проверить. Пучков был прав, как и p51x. Если память критична, то нужно динамический массив брать почастям. Хотя может и std::vector<bool> хватить

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Пользуйте std::vector, у него для bool особая реализация.
Большое спасибо!

Давайте вместе подумаем, как сделать двумерный std::vector<bool>?

Последний раз редактировалось 8Observer8; 22.10.2014 в 17:11.
8Observer8 вне форума Ответить с цитированием
Старый 22.10.2014, 17:15   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Кто подскажет. Почему программа аварийно завершается?

Код:
#include <iostream>

int main()
{
    int arr[4800][2400];

    std::cout << sizeof(arr) << std::endl;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 22.10.2014, 17:20   #18
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

У меня только одно предположение: свободно только 35 МБайт оперативы:

8Observer8 вне форума Ответить с цитированием
Старый 22.10.2014, 17:26   #19
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
С чего вы взяли, что bool - это бит?
На bool уходит один байт
8Observer8 вне форума Ответить с цитированием
Старый 22.10.2014, 17:40   #20
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Придумал двумерный массив для bool на std::vector<bool>. Программа отрабатывает нормально

Код:
#include <iostream>
#include <vector>
#include <stdexcept>

int main()
{
    std::vector<std::vector<bool> > arr;

    std::vector<bool> subArr( 2400 );

    for ( size_t i = 0; i < 4800; ++i ) {
        arr.push_back( subArr );
    }

    try {
        arr.at( 4799 ).at( 2399 ) = 1;
        std::cout << arr.at( 4799 ).at( 2399 ) << std::endl;
    } catch( const std::out_of_range &e ) {
        std::cerr << "Error: out of range" << std::endl;
        return 1;
    }

    std::cout << sizeof( arr[0][0] ) << std::endl;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация мира O m n i s Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 29.10.2013 23:12
Хранение значений в массиве и их подсчет. manula Microsoft Office Excel 9 12.07.2013 14:47
Web карта мира mutabor Свободное общение 2 11.09.2009 22:19