HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #4981  
Старый 07.12.2020, 15:32
loganhackerdff
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами: 4633764

Репутация: 148


По умолчанию

Цитата:
Сообщение от LuaQ  

Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
По моему месет но он небезопасен

И иногда компилятор его опускает
 
Ответить с цитированием

  #4982  
Старый 07.12.2020, 15:38
#Northn
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами: 4609424

Репутация: 183


По умолчанию

Цитата:
Сообщение от loganhackerdff  

И иногда компилятор его опускает
кого опускает? кто он такой чтобы опускать? какое у него право?

Цитата:
Сообщение от LuaQ  

Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
Кто быстрее: memset, bzero или std::fill

Есть мнение, что алгоритм std::fill() работает столько же эффективно на простых типах, как и старый добрый memset() (так как он его и использует в некоторых специализациях). Но порой не все так...

habr.com
 
Ответить с цитированием

  #4983  
Старый 08.12.2020, 02:07
dekname
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами: 2885808

Репутация: 13
По умолчанию

Как можно сделать функцию, которая находится в классе, коллбэком для cmdproc? (samp-api)
 
Ответить с цитированием

  #4984  
Старый 08.12.2020, 02:08
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от dekname  

Как можно сделать функцию, которая находится в классе, коллбэком для cmdproc? (samp-api)
static
 
Ответить с цитированием

  #4985  
Старый 08.12.2020, 03:07
dekname
Познающий
Регистрация: 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
)
{
}


Но так я получаю зависание игры, как можно пофиксить?
 
Ответить с цитированием

  #4986  
Старый 08.12.2020, 03:09
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от dekname  

Получить адрес через union
Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
 
Ответить с цитированием

  #4987  
Старый 08.12.2020, 03:22
dekname
Познающий
Регистрация: 19.11.2020
Сообщений: 44
С нами: 2885808

Репутация: 13
По умолчанию

Цитата:
Сообщение от KiN4StAt  

Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
ок, какие есть варианты, если не делать метод статичным?
 
Ответить с цитированием

  #4988  
Старый 08.12.2020, 03:23
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от dekname  

ок, какие есть варианты, если не делать метод статичным?
Никаких.
 
Ответить с цитированием

  #4989  
Старый 08.12.2020, 03:35
memir
Постоянный
Регистрация: 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 на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
Цитата:
 
Ответить с цитированием

  #4990  
Старый 08.12.2020, 04:38
san0
Постоянный
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.