Pull to refresh
140
0.4
Евгений @JordanCpp

Разработчик

Send message

Сейчас я тестирую библиотеку под dos, в dosbox, конфигурация процессор 286 от 15 -33 mhz. И оно довольно шустро работает, ни один профайлер не покажет как оптимизировать под такое железо. И конечно я пользуюсь профайлером под современным windows и linux.

Я сейчас портирую SDL3Lite под dos и windows 3.1 и да, если нужно написать printf, я скопирую реализацию из musl или подобной либы и алаптирую. Это не сверх задача, по сравнению с тем, что уже сделано.

Теперь фраза "C++ уже не тот" с новыми фичами, заиграла другими красками.

Как говорится дождались, осталось дождаться когда реализуют в компиляторах.

Почему с рефлексией так тянули, аж с 2007? Малый интерес или неготовность ядра С++ на то время?

Как пример скриптования с низкими задержками. Это игра Fallout 1 и Fallout 2. Скрипты пишутся на смеси С и Pascal. Язык называется SSL - Star trek script language. Скрипт переводится в свой байткод, игра его интерпретирует. Ну и оригинальные игры спокойно работают на железе pentium 75 mhz, без risc-v и смс:)

Умели же.

А если сразу писать скрипты на С++? Минуя вот это вот всё?

Т.е. создаем виртуальную машину с архитектурой весьма вероятно отличающейся от хостовой, запускаем в ней слой эмуляции linux и уже в нем запускаем свои скрипты и говорим что нас интересуют минимальные задержки?

Вы не понимаете, это другое:)

Скорость ЦПУ подняли, но скорость исполнения кода на этих ЦПУ, всрали. Извиняюсь, просто другого слова не нашел, для выражения общей тенденции.

Я вообще удивлён, что ещё не выложили на gitflic сорцы и не делают текущие сборки. Зашёл скачал, если нужно скачал сорцы и собрал.

Ну вы бы хоть график построили. Вот вам массив циферок, удачного парсинга. Я же не компьютер.

Спасибо за напоминание, почему не надо писать на интринсиках:)

Главное, что бы это все в очередной раз не сломалось под своей тяжестью.

Спасибо конечно за информацию. Гуглить, гуглить и ещё раз гуглить.

Мне не нравится вариант с unique_ptr тем, что будет по крайней мере один new. Банальный пример, а уже лезем в память. Возможно, что как то все оптимизируется. Я не вникал, как оно там устроено. Если, что поправьте.

Ну и как предложили выше можно сделать нормальную обёртку конкретно для виндовых структур.

Это будет оптимальнее. Хотя желание автора тоже понятно. Некий стандартный универсальный механизм.

Примерно так, так как HANDLE используется чуть менее чем во всем WinAPI облегчит жизнь. Это общая идея. Таким образом типизировать другие типы. Добавить inline, но со сборкой O2 думаю и так компилятор догадается.

template <typename T>
class Handler
{
public:
	Handler(T handle) :
		_handle(handle)
	{
	}
	~Handler()
	{
		if (_handle != nullptr) CloseHandle(_handle);
	}

	T Get()
	{
		return _handle;
	}

	bool Ok()
	{
		return _handle != nullptr;
	}
private:
	T _handle;
};

Ещё вариант, без мам, пап и unique_ptr

bool MakeDumpToFile(DWORD pid, PCWCHAR filename)
{
	Library dbgdll("dbghelp.dll");
	if (!dbgdll.Ok()) return false;

	auto pfnMiniDumpWriteDump = (decltype(&MiniDumpWriteDump)) dbgdll.GetAddress("MiniDumpWriteDump");
	if (!pfnMiniDumpWriteDump) return false;
		
	Handler<HANDLE> proc(procOpenProcess(PROCESS_ALL_ACCESS, FALSE, pid));
	if (!proc.Ok()) return false;
			
	Handler<HANDLE> file(CreateFileW(filename, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL));
	if (!file.Ok() && file.Get() == INVALID_HANDLE_VALUE) return false;
				
	bool result = pfnMiniDumpWriteDump(proc.Get(), pid, file.Get(), MiniDumpNormal, NULL, NULL, NULL);
	return result;
}

Придумал, ещё вариант по старинке:) Класс Library и Handler дергают деструктор FreeLibrary и CloseHandle.

bool MakeDumpToFile(DWORD pid, PCWCHAR filename)
{
	Library dbgdll("dbghelp.dll");
	if (dbgdll.Ok())
	{
		auto pfnMiniDumpWriteDump = (decltype(&MiniDumpWriteDump)) dbgdll.GetAddress("MiniDumpWriteDump");
		if (pfnMiniDumpWriteDump)
		{
			Handler<HANDLE> proc(procOpenProcess(PROCESS_ALL_ACCESS, FALSE, pid));
			if (proc.Ok())
			{
				Handler<HANDLE> file(CreateFileW(filename, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL));
				if (file.Ok() && file.Get() != INVALID_HANDLE_VALUE)
				{
					bool result = pfnMiniDumpWriteDump(proc.Get(), pid, file.Get(), MiniDumpNormal, NULL, NULL, NULL);
					return result;
				}
			}
		}
	}

	return false;
}

Современные фичи С++ это хорошо, правильно. Но если уж исходить из юзабилити, вполне понятный вариант второй. Проверил, прочитал, закрыл. Никто же не мешает отделить LoadLibraryA и FreeLibrary в класс и дергать его в данном методе при выходе из функции сработает деструктор. Написать шаблон с HANDLE, который в деструкторе будет всегда CloseHandle(file) это делать.

Помню, вроде на rsdn подобный код был, типа заворачиваем WinApi в ООП с конструкторами и деструкторами.

bool MakeDumpToFile(DWORD pid, PCWCHAR filename)
{
	HMODULE dbgdll = LoadLibraryA("dbghelp.dll");
	if (dbgdll)
	{
		auto pfnMiniDumpWriteDump = (decltype(&MiniDumpWriteDump)) GetProcAddress(dbgdll, "MiniDumpWriteDump");
		if (pfnMiniDumpWriteDump)
		{
			HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
			if (proc)
			{
				HANDLE file = CreateFileW(filename, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
				if (file && file != INVALID_HANDLE_VALUE)
				{
					bool result = pfnMiniDumpWriteDump(proc, pid, file, MiniDumpNormal, NULL, NULL, NULL);
					CloseHandle(file);
					return result;
				}
				CloseHandle(proc);
			}
		}
		FreeLibrary(dbgdll);
	}
	return false;
}
1
23 ...

Information

Rating
609-th
Location
Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Database Developer
Lead
SQL
Linux