Size: a a a

2020 December 14

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Constantine Drozdov
An __asm block can call only global C++ functions that are not overloaded. If you call an overloaded global C++ function or a C++ member function, the compiler issues an error.
https://docs.microsoft.com/en-us/cpp/assembler/inline/calling-cpp-functions-in-inline-assembly?view=msvc-160
Короче, никак... ясно. Спасибо.
источник

AK

Andrei K in pro.cxx
magras
Хотя я до сих пор не знаю в каких случаях указатель на член класса становится сложным. По-идее это нужно для виртуальных методов, и адрес push_back может быть обычным указателем на функцию.
Емнип, он вообще всегда сдвоенный.
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
magras
Можно попробовать взять "адрес" push_back (кажется, это уже UB, но при наличии __asm в коде, я думаю это уже не страшно) и вызвать через него. Вероятно просто так вызвать не получится и понадобится расковырять представление указателя на член класса, чтобы найти настоящий адрес функции.
Это я уже понял. Но почему UB?
источник

AK

Andrei K in pro.cxx
Eugene Krasnikov (ᴊɪɴ x)
Короче, никак... ясно. Спасибо.
Способов миллион. Зависит от того, что надо сделать.
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Andrei K
Способов миллион. Зависит от того, что надо сделать.
Я имею в виду напрямую, без создания отдельных переменных с адресом.
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Ну как что сделать? Вызвать метод :)
источник

s

std::slavik in pro.cxx
Eugene Krasnikov (ᴊɪɴ x)
Я имею в виду напрямую, без создания отдельных переменных с адресом.
источник

AK

Andrei K in pro.cxx
Зачем это делать непременно из ассемблера? Уже предложили выше вариант с глоабльой функцией, которая принимает референс на вектор и на элемент.
источник

m

magras in pro.cxx
Eugene Krasnikov (ᴊɪɴ x)
Это я уже понял. Но почему UB?
Нельзя брать адрес функций из стандартной библиотеки.
На сколько я понимаю, это позволяет комитету менять сигнатуру не ломая пользовательский код, например, добавив в конец списка аргументов новый аргумент со значением по-умолчанию.
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Не вижу тут ответа :)
источник

AK

Andrei K in pro.cxx
Если прям именно хочется из ассемблера — то да, манглинг сделать, и убедиться, что шаблон такой соберётся.
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
magras
Нельзя брать адрес функций из стандартной библиотеки.
На сколько я понимаю, это позволяет комитету менять сигнатуру не ломая пользовательский код, например, добавив в конец списка аргументов новый аргумент со значением по-умолчанию.
А, ясно.
источник

IL

Ignat Loskutov in pro.cxx
Но зачем, если можно просто написать функцию-обёртку и вызвать её
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Andrei K
Если прям именно хочется из ассемблера — то да, манглинг сделать, и убедиться, что шаблон такой соберётся.
Как его делать-то?
источник

s

std::slavik in pro.cxx
Ignat Loskutov
Но зачем, если можно просто написать функцию-обёртку и вызвать её
+
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Ignat Loskutov
Но зачем, если можно просто написать функцию-обёртку и вызвать её
Просто так надо :)
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Ignat Loskutov
Но зачем, если можно просто написать функцию-обёртку и вызвать её
Ну это можно, но это обходной путь опять же :)
источник

EK

Eugene Krasnikov (ᴊɪ... in pro.cxx
Мне интересно просто было, можно ли напрямую. Я понял, что нет.
источник

s

std::slavik in pro.cxx
да можно конечно
источник

AK

Andrei K in pro.cxx
Можно, просто сложно.
источник