 |
|

07.12.2020, 15:32
|
|
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами:
4633764
Репутация:
148
|
|
Сообщение от LuaQ
Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
По моему месет но он небезопасен
И иногда компилятор его опускает
|
|
|

07.12.2020, 15:38
|
|
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами:
4609424
Репутация:
183
|
|
Сообщение от loganhackerdff
И иногда компилятор его опускает
кого опускает? кто он такой чтобы опускать? какое у него право?
Сообщение от LuaQ
Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
Кто быстрее: memset, bzero или std::fill
Есть мнение, что алгоритм std::fill() работает столько же эффективно на простых типах, как и старый добрый memset() (так как он его и использует в некоторых специализациях). Но порой не все так...
habr.com
|
|
|

08.12.2020, 02:07
|
|
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами:
2885808
Репутация:
13
|
|
Как можно сделать функцию, которая находится в классе, коллбэком для cmdproc? (samp-api)
|
|
|

08.12.2020, 02:08
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от dekname
Как можно сделать функцию, которая находится в классе, коллбэком для cmdproc? (samp-api)
static
|
|
|

08.12.2020, 03:07
|
|
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами:
2885808
Репутация:
13
|
|
Сообщение от KiN4StAt
static
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:
C++:
Код:
// union
union
UnionCallbackCommand
{
using
ptr_t
=
void
(
SomeClass
::
*
)
(
const
char
*
)
;
ptr_t ptr
;
uint64_t
addr_as_uint64
;
}
;
// получение адреса
m_union_cmd_callback
.
ptr
=
&
SomeClass
::
Command
;
// в private:
UnionCallbackCommand m_union_cmd_callback
;
// регистрация команды:
m_input
->
AddCommand
(
"somecommand"
,
(
sampapi
::
CMDPROC
)
&
m_union_cmd_callback
.
addr_as_uint64
)
;
// сам callback
void
SomeClass
::
Command
(
const
char
*
cmd
)
{
}
Но так я получаю зависание игры, как можно пофиксить?
|
|
|

08.12.2020, 03:09
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от dekname
Получить адрес через union
Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
|
|
|

08.12.2020, 03:22
|
|
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами:
2885808
Репутация:
13
|
|
Сообщение от KiN4StAt
Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
ок, какие есть варианты, если не делать метод статичным?
|
|
|

08.12.2020, 03:23
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от dekname
ок, какие есть варианты, если не делать метод статичным?
Никаких.
|
|
|

08.12.2020, 03:35
|
|
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами:
5646349
Репутация:
163
|
|
Сообщение от dekname
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:
C++:
Код:
// union
union
UnionCallbackCommand
{
using
ptr_t
=
void
(
SomeClass
::
*
)
(
const
char
*
)
;
ptr_t ptr
;
uint64_t
addr_as_uint64
;
}
;
// получение адреса
m_union_cmd_callback
.
ptr
=
&
SomeClass
::
Command
;
// в private:
UnionCallbackCommand m_union_cmd_callback
;
// регистрация команды:
m_input
->
AddCommand
(
"somecommand"
,
(
sampapi
::
CMDPROC
)
&
m_union_cmd_callback
.
addr_as_uint64
)
;
// сам callback
void
SomeClass
::
Command
(
const
char
*
cmd
)
{
}
Но так я получаю зависание игры, как можно пофиксить?
Действительно, делай static
Сообщение от Спойлер
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
|
|
|

08.12.2020, 04:38
|
|
Постоянный
Регистрация: 15.12.2013
Сообщений: 412
С нами:
6530249
Репутация:
133
|
|
Сообщение от #Northn
кого опускает? кто он такой чтобы опускать? какое у него право?
Прямое право он имеет) https://en.wikipedia.org/wiki/As-if_rule https://en.cppreference.com/w/cpp/language/as_if
Как простой пример - https://godbolt.org/z/o9vsGr
memset растворился даже при минимальной оптимизации (-O(1))
Именно по этой причине в языке c++ существует такое большое количество неопределенных (иногда unspecified, или implementation-defined) поведений по типу порядка вычисления аргументов и множества других, а также есть ключевое слово volatile.
Плюс еще, для таких задач, как, например, эта с memset, есть специальные функции под платформы:
Win - SecureZeroMemory, BSD - explicit_bzero, Linux Kernel - memzero_explicit, OpenSSL - OPENSSL_cleanse и т.д.
Специальная версия функции в стандарте С11 memset_s - https://en.cppreference.com/w/c/string/byte/memset
И еще и флаги компиляторов по типу -fno-builtin-memset, или #pragma optimize("", off)
Ну и volatile
Сообщение от LuaQ
Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
Посмотрите еще этот ответ, вопрос был похожий - https://www.blast.hk/threads/781/page-294#post-439421
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|