-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80




Форум на Исходниках.RU


Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://forum.sources.ru.
Данный дневник сформирован из открытого RSS-источника по адресу http://forum.sources.ru/yandex.php, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 21:12 + в цитатник
OpenGL: Ха. Посмотрел сейчас ассемлерный выхлоп, поигрался с исходником... В общем, почему-то если size_t константа (компилил в дебаге с выключенной оптимизацией), то в operator new[] аргумент передаётся через ecx, так что неудивительно, что 8-байтовое целое урезается:
    ; 13 : char* ptr = new char[total];
    mov ecx, 1073741824 ; 40000000H
    call ??_U@YAPEAX_K@Z ; operator new[]
    mov QWORD PTR $T1[rbp], rax
    mov rax, QWORD PTR $T1[rbp]
    mov QWORD PTR ptr$[rbp], rax

Если я делаю её переменной, или вообще выношу значение в другую единицу трансляции (т.е. вызываю new char[get_size()]), то всё становится корректно, т.к. аргумент начинает передаваться через rcx:
    ; 13 : char* ptr = new char[total];
    mov rcx, QWORD PTR total$[rbp]
    call ??_U@YAPEAX_K@Z ; operator new[]
    mov QWORD PTR $T1[rbp], rax
    mov rax, QWORD PTR $T1[rbp]
    mov QWORD PTR ptr$[rbp], rax

Выглядит как баг какой-то.

Добавлено
Да, это, похоже, баг самого посленего msvc 2019:
https://godbolt.org/z/1f1hTv

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842358


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 20:35 + в цитатник
Qraizer:
Цитата Black_Dragon @
А что в стандарте не предусмотрено, что если ты столько не можешь, то вернуть нуль???
В Стандарте предусмотрено, что если allocation function не может вернуть блок запрошенного размера, то должна быть вызвана new-handler function, которая может быть установлена посредством std::set_new_handler(). Если таковой нет, должно быть брошено std::bad_alloc. Если таковая есть, то вызвать её и по возврату назад повторить попытку найти нужное количество памяти, и далее по циклу. В свою очередь к new-handler function предъявляются требования либо найти сколько-нибудь места и вернуть управление, либо бросить std::bad_alloc или производный от него, либо завершить программу без возврата. Учитывая, что требования к new-handler function обязан учитывать сам программист, который такую собрался писать, понятно, что любые несоответствия Стандарту тут, если таковые будут, следует предъявлять к нему, а не Стандарту.
В черновике C++17 я не нашёл требования, как именно в последнем случае программа должна завершаться, однако во всех релизах Стандарта есть замечательная std::terminate(), как будто бы спецом для этого. На самом деле есть чёткий список, когда std::terminate() будет вызываться, и new-handler function там отсутствует. Вероятно, из-за того, что гарантировать соблюдение этих требований Стандарт в принципе не в состоянии, не от него это зависит.
Цитата Black_Dragon @
Мы то получаем валидный указатель, но на меньший объем...
Вот уж чего точно не может быть ни в коем случае. Если вдруг кто-то увидит перегруженный new который позволяет себе вести себя подобным образом, пусть смело кидает автору пожизненный страйк без выходного пособия.

Добавлено
P.S. Ты уверен, что правильно size_t приготовил, Black_Dragon? Например, 5*1024*1024*1024 – это неправильно. И даже 0x140000000 тоже неправильно.

Добавлено
P.P.S. В Стандарте предусмотрено сразу вернуть nullptr безо всяких new-handler function, но для этого вызывать нужно не просто new, а new (std::nothrow).

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842357


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 20:01 + в цитатник
ЫукпШ:
Цитата Black_Dragon @
А что в стандарте не предусмотрено, что если ты столько не можешь, то вернуть нуль???
Мы то получаем валидный указатель, но на меньший объем...

Что-то тут не таку вас..
Когда у меня не получилось, мне вернули NULL вместо адреса.
я попробовал взять 2Г для x86 системы.
---
А в целом всё получилось.
Исходник всзял у Qraizer-а почти без изменений.
Перегрузил new/delete чтобы следить за выделяемыми блоками.
Собирал всё в VS2008 Express, WinXP Home Sp3
Исходник:
Скрытый текст

    // ---------------------------------------------------------------------------------
    // Перегрузка операции new.
    inline void* __cdecl operator new(size_t size)
    {
    char* pt = typebuff;
    size_t sizeS = ARRAYSIZE(typebuff);
    size_t n = 0;
    void* p = malloc(size);
    n = SimpleRs::addr2asc(pt, sizeS, " p=0x", p);
    pt += n; sizeS -= n;
    #ifdef _M_IX86
    n = SimpleRs::dword2dec (pt, sizeS, " size=", size);
    #endif
    #ifdef _M_AMD64
    n = SimpleRs::qword2asc (pt, sizeS, " size=0x", (unsigned long long )size);
    #endif
    ::OutputDebugStringA(typebuff);
    return p;
    }
    // ---------------------------------------------------------------------------------
    // Перегрузка операции delete.
    inline void __cdecl operator delete(void *p)
    {
    free (p);
    }
    // ---------------------------------------------------------------------------------
    int __cdecl _tmain(int argc, TCHAR **argv)
    {
    ::OutputDebugString(_T("----- vvv -----"));
    #ifdef _M_IX86
    size_t v1 = 2;
    #endif
    #ifdef _M_AMD64
    size_t v1 = 5;
    #endif
    size_t v2 = 1024;
    size_t total = v1;
    total *= v2;
    total *= v2;
    total *= v2;
    char *ptr = NULL;
    ptr = new char[total];
    ptr[0] = 'a';
    ptr[total - 1] = 'z';
    std::cout << sizeof(size_t) << '\t' << reinterpret_cast(ptr) << '\n' << ptr[0] << ptr[total - 1] << std::endl;
    delete[] ptr;
    ::OutputDebugString(_T("----- ^^^ -----"));
    }


В итоге получилось так:
user posted image
Диагностика из Dbgview:
user posted image
За пределами "заборчика" - это работа старт-апа.

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842356


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 19:48 + в цитатник
Black_Dragon: А что в стандарте не предусмотрено, что если ты столько не можешь, то вернуть нуль???
Мы то получаем валидный указатель, но на меньший объем...

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842355


Метки:  

Воспроизведение больших видео файлов из приложения WIN32

Понедельник, 23 Ноября 2020 г. 19:31 + в цитатник
B.V.:
Цитата a_n_y_a @
Видео файл 6 Гб, он читается целиком в память, или последовательно?

https://docs.microsoft.com/en-us/windows/wi...w-in-directshow
https://docs.microsoft.com/en-us/windows/wi...-and-allocators
Видео читается сэмплами, размер которых зависит от построенного графа.

https://forum.sources.ru/index.php?showtopic=420850&view=findpost&p=3842354


Метки:  

Воспроизведение больших видео файлов из приложения WIN32

Понедельник, 23 Ноября 2020 г. 15:52 + в цитатник
Gonarh:
Цитата a_n_y_a @
Видео файл 6 Гб, он читается целиком в память, или последовательно?

А что будет, если потребуется прочесть файл 20 гиг весом или 100? Никто, разумеется, не читает весь файл целиком.

https://forum.sources.ru/index.php?showtopic=420850&view=findpost&p=3842351


Метки:  

Воспроизведение больших видео файлов из приложения WIN32

Понедельник, 23 Ноября 2020 г. 15:48 + в цитатник
a_n_y_a: Приложение WIN32, система выделяет при старте 2 Гб, файл видео 6 Гб. Откуда берется память для видео? Использую интерфейсы:
IMFPMediaPlayer, IMFMediaSource, и IMFPMediaItem. Простое приложение, по нажатию на кнопку запускается проигрывание видео файла. Приложение WIN32, система может выделить не более 2 Гб памяти. Видео файл 6 Гб, он читается целиком в память, или последовательно? Изучается вопрос, надо ли переходить с WIN32 на WIN64?

https://forum.sources.ru/index.php?showtopic=420850&view=findpost&p=3842350


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 15:22 + в цитатник
Qraizer:
Цитата ЫукпШ @
Сам по себе new память не выделяет, он вызывает malloc.
В Стандарте это нигде не гарантируется. Более того, он содержит утверждения, что allocation functions и C memory allocations являются разными средствами, работающими с разными аренами, хотя и не запрещает реализацию первых посредством вторых

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842349


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 15:20 + в цитатник
OpenGL:
Цитата ЫукпШ @
Значит, если есть ограничение, это ограничение malloc-a.

Вряд ли. В данном случае именно в operator new[] уже приходит урезанное число. Позже проверю вызов с malloc

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842348


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 14:55 + в цитатник
ЫукпШ: Сам по себе new память не выделяет, он вызывает malloc.
Значит, если есть ограничение, это ограничение malloc-a.
Если всё-таки очень нужно использование new с очень большими объёмами,
тогда можно попробовать new/delete перегрузить и использовать их вместе с VirtualAlloc/VirtualFree.

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842347


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 11:22 + в цитатник
Black_Dragon: VS 2019
Консольный в 64x
размер size_t - 8

16Гб оперативки (свободно 50%)
Запускаем, выделение по диспетчеру 1Гб (1024,4), в программе ошибка доступа к последнему байту, указатель не нулевой.

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842345


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 09:14 + в цитатник
OpenGL: Странно. У меня в operator new[] приходит аргумент типа size_t, но усечённый до uint32_t, т.е. в данном случае 1 гигабайт. И поэтому падает всё. VS 2019.

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842340


Метки:  

оператор new выделение памяти больше 4Gb

Понедельник, 23 Ноября 2020 г. 01:24 + в цитатник
Qraizer:
Цитата OpenGL @
в clang работает нормально, в студии - нет.
    #include
    int main()
    {
    const size_t total = 5ll * 1024 * 1024 * 1024;
    char *ptr = nullptr;
    ptr = new char[total];
    ptr[0] = 'a';
    ptr[total - 1] = 'z';
    std::cout << sizeof(size_t) << '\t' << reinterpret_cast(ptr) << '\n' << ptr[0] << ptr[total - 1] << std::endl;
    delete[] ptr;
    }

VS 2017
    8 000001180F591040
    az

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842337


Метки:  

brainstorm: текстовый менюшный квест 33 коровы

Понедельник, 23 Ноября 2020 г. 00:10 + в цитатник
ya2500: Маленькая математическая головоломка:

А я написал небольшую арифметическую головоломку на Митриле(первая игра на этом движке). Играть онлайн без регистрации можно здесь: 5 троллей. Плохо то, что достижения и таблица рекордов ведутся только для зарегистрированных игроков. Но хорошо то, что зарегистрированным игроком считается даже тот, кто просто вошёл туда через вконтакте или что там ещё предусмотрено -- вот, как раз я поленился там регистрироваться и всегда вхожу через вконтакте и поэтому я там виден под своим настоящим именем(см автора игры).

https://forum.sources.ru/index.php?showtopic=384852&view=findpost&p=3842336


Метки:  

SynEdit Gutter.ShowModifdcation

Воскресенье, 22 Ноября 2020 г. 22:56 + в цитатник
estra: Здравствуйте форумчане.

Кто знает как работает эта опция (SynEdit -> Gutter.ShowModifdcation)? Помогите разобраться. Включил, а цвет рядом с модифицированными формами не меняется. Как изменять цвет рядом с модифицированными строками?

https://forum.sources.ru/index.php?showtopic=420848&view=findpost&p=3842335


Метки:  

Видеоприкол!!

Воскресенье, 22 Ноября 2020 г. 20:57 + в цитатник
Prince: RUSSIAN CYBERPUNK FARM
Цитата
Говорят, что Россия – технически отсталая страна, нет дорог, роботехника не развивается, ракеты не летают, а почта идет слишком долго. It’s a bullshit.

https://forum.sources.ru/index.php?showtopic=186975&view=findpost&p=3842331


Метки:  

оператор new выделение памяти больше 4Gb

Воскресенье, 22 Ноября 2020 г. 18:14 + в цитатник
OpenGL: На другой компилятор перейти есть возможность? Например, вот это:
    int main()
    {
    const size_t total = 5ll * 1024 * 1024 * 1024;
    char *ptr = new char[total];
    ptr[0] = 'a';
    ptr[total - 1] = 'z';
    std::cout << ptr[0] << ptr[total - 1] << std::endl;
    }

в clang работает нормально, в студии - нет.

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842326


Метки:  

Задача два кувшина с водой. Поиск в глубину в swi-prolog.

Воскресенье, 22 Ноября 2020 г. 17:59 + в цитатник
TigerMoonz: Всем доброго времени суток я недавно начал программировать в swi-prolog и столкнулся с трудностями с решением этой задачи.

Имеется два кувшина вместимостью 5 и 8 л, и необходимо отмерить 4 литра из
бочки с водой (воды в бочке неограниченно много). Возможными операциями являются:
1) наполнение кувшина водой из бочки (кувшин наполняется полностью);
2) выливание
содержимого кувшина в бочку;
3) переливание из одного кувшина в другой до полного опустошения первого, либо до полного заполнения второго.
Указания к решению. Различные состояния этой задачи задаются информацией,сколько воды в первом кувшине и сколько во втором. Поэтому структура state(Объем_воды_в_первом_кувшине, Объем_воды_во_втором_кувшине) описывает состояние задачи. Начальное состояние state(0, 0), конечные состояния – state(_,4) или state(4,_).

Требуется написать программу для решения это задачи (Два кувшина с водой. Поиск в глубину).Заранее спасибо!

    % Алгоритм поиска в глубину я смог найти
    solve(Start,Solve):- % Start - начальная вершина, Solve - искомый путь
    depth([],Start,Solve).
    depth(P,X,[X|P]):-
    goal(X). % этот предикат проверяет,
    % является ли вершина целевой
    depth(P,X,Solve):-
    next(X,X1),
    not(member(X1,P)),
    depth([X|P],X1,Solve).

https://forum.sources.ru/index.php?showtopic=420847&view=findpost&p=3842325


Метки:  

wofstream wstring и запись русского текста в файл

Воскресенье, 22 Ноября 2020 г. 14:16 + в цитатник
Qraizer:
Цитата a_n_y_a @
Это следствие использования locale?
Если вопрос в этом, а других я не увидел, то ответ – нет. Потоки в std все и всегда байтовые, но вопрос в том, как интерпретировать пропускаемые через поток последовательности байт. Внутреннее и внешнее представления символов в этом потоке могут отличаться, и зачастую так и есть. Например, в файле лежит UTF8, а программа работает с std::wstring, т.е. с (не совсем так) UTF16, поэтому при вводе-выводе должно выполняться преобразование из одной формы в другую.
В файловых потоках за это отвечает фасет std::codecvt<>, который задействуется при форматном вводе/выводе. Любая локаль, даже стандартная std::locale::classic, по умолчанию содержит std::codecvt<>, который преобразует wchar_t (это если std::w(i/o)fstream) в char стандартным образом: в стандартные однобайтовые символы. Когда ты стандартную локаль заменяешь на кастомную, в std::codecvt<> всего лишь меняются правила соответствия между char и wchar_t, но преобразование в однобайтовую форму всё равно будет. Если такое поведение неприемлемо, то: либо это правило нужно изменить подменой фасета; либо – для простых операций это проще – вместо форматного ввода/вывода бинарный, он не задействует преобразование потока байтов. В первом примере у тебя использовался форматный, в следующем бинарный. Потому и разница.

P.S. Это что касается потоковых классов из Стандарта языка. CFile таковым не является, это продукт сугубо MS. Всё вышесказанное к нему может не иметь никакого отношения.

https://forum.sources.ru/index.php?showtopic=420830&view=findpost&p=3842323


Метки:  

оператор new выделение памяти больше 4Gb

Воскресенье, 22 Ноября 2020 г. 13:01 + в цитатник
Wound:
Цитата a_n_y_a @
Стандартный оператор new выделяет память не более 4 гигабайт.

Откуда информация?
Вот например почитай обсуждение: http://rsdn.org/forum/winapi/2786441.flat
Там люди выделяют больше 4 гигабайт оператором new :-? Но наверное лучше воспользоваться VirtualAlloc, как советуют в обсуждении. И хорошо подумать - а дествительно памяти надо больше 4 гигов?

https://forum.sources.ru/index.php?showtopic=420846&view=findpost&p=3842322


Метки:  

Поиск сообщений в rss_forum_sources_ru
Страницы: 2628 ... 2464 2463 [2462] 2461 2460 ..
.. 1 Календарь