powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Константный экземпляр класса. Кто как делает?
19 сообщений из 94, страница 4 из 4
Константный экземпляр класса. Кто как делает?
    #39651096
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и?
Топик закрываю?
ТСу решать
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651161
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivЕщё раз, ваш чисто теоретический спор лишён всякого смысла, поскольку все вызовы всего кода создания чего-то на стеке и потом вызова констуктора инлайнятся.
Абсолютно по барабану, как это всё происходит.
Я об этом ниже написал, переходя от голой теории к конкретике.Если переходить к конкретике, то в твоём примере никакой экземпляр класса вообще не создается - нигде, а компилятор на -O3 заменяет метод объекта и его член-переменную функциональным эквивалентом, т.е., просто фигачит jmp на rand() из main.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651162
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и?
Топик закрываю?В общем-то, перетёрли уже всё, что только можно было перетереть и "в" и "около". Закрывай, коль надоела эта байда.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651166
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЕсли переходить к конкретике, то в твоём примере никакой экземпляр класса вообще не создается - нигде, а компилятор на -O3 заменяет метод объекта и его член-переменную функциональным эквивалентом, т.е., просто фигачит jmp на rand() из main.
Хе-хе, так в том-то и была суть всего, что я тебе талдычу уже третью страницу топика.
Да даже на -O1 останется лишь jmp.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651171
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZХе-хе, так в том-то и была суть всего, что я тебе талдычу уже третью страницу топика.
Да даже на -O1 останется лишь jmp.Told'ычить-то ты, конечно, told'ычишь, но объекта как не было, так и нет, а мы говорим именно об объектах.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651172
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv0) placement new не переопределяется.
1) код placement new -- это вызов констуктора с указанным placement-у указателем на память в виде this .
2) соответственно, код placement new всегда инлайнится. Это собственно один вызов функции.Да брось! Всё прекрасно переопределяется:
Код: plaintext
1.
2.
3.
4.
void* operator new(size_t size, void *p)
{
  return p;
}
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651190
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devTold'ычить-то ты, конечно, told'ычишь, но объекта как не было, так и нет, а мы говорим именно об объектах.
В терминал языка ассемблера вообще объектов нет, это чисто тот удобный фасад для программистов чтобы они не видели всю поднаготную. И именно такие вот оптимизации, выкидывающие вообще всякие там упоминания о твоём классе и его мемберах из итогового ассемблера, демонстрируют тебе, что нет никаких фаз выделения памяти на стеке и вызова placement new , они существуют только в твоём сознании.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651192
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

В терминах*
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651327
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZВ терминал языка ассемблера вообще объектов нет, это чисто тот удобный фасад для программистов чтобы они не видели всю поднаготную.Объектов нет не в терминах ассемблера, а в терминах машинных кодов, а в терминах ассемблера он вполне себе существует и, причем, с виртуальными методами. Например, в TASM.

NekZИ именно такие вот оптимизации, выкидывающие вообще всякие там упоминания о твоём классе и его мемберах из итогового ассемблера, демонстрируют тебе, что нет никаких фаз выделения памяти на стеке и вызова placement new , они существуют только в твоём сознании.Да что ты говоришь? Попробуй-ка при при максимальной оптимизации добавить квалификатор volatile к объявлению метода MyClass::f*(), к объявлению экземпляра класса собери и удивись "силе моего сознания".
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651334
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devДа что ты говоришь? Попробуй-ка при при максимальной оптимизации добавить квалификатор volatile к объявлению метода MyClass::f*(), к объявлению экземпляра класса собери и удивись "силе моего сознания".
Давай.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <cstdlib>
#include <new>
#include <malloc.h>

struct MyClass{ int x; MyClass() { x = rand(); } int f() volatile { return x; } };

int main()
{
    volatile MyClass foo;
    return foo.f();
}



clang -O3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
main: # @main
  push rax
  call rand
  mov dword ptr [rsp + 4], eax
  mov eax, dword ptr [rsp + 4]
  pop rcx
  ret
Где выделение памяти под объект?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651344
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZГде выделение памяти под объект?

push rax


?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651349
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevNekZГде выделение памяти под объект?

push rax


?
Нет, это пушится адрес возврата для последующей инструкции call
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651360
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZНет, это пушится адрес возврата для последующей инструкции callЛеонид абсолютно прав!
"push rax" расширяет стек вниз на 8 байт, сохраняя там значение из "rax", что равносильно (в нотации Intel):
Код: asm
1.
2.
sub rsp, 8
mov dword ptr [rsp], rax

Обычно, компилятор примерно так и делает, но в данном, конкретном случае, расширение кадра невелико и компилятор, почему-то, выбрал "push rax" с инициализацией памяти на стеке из регистра "rax", вместо "sub rsp, 8" без инициализации.
Далее, по соглашению __cdecl, результат функции rand() помещается в регистр "eax" и мнемоника "mov dword ptr [rsp + 4], eax" указывает нам на то, что значение из регистра "eax" помещается, в старшее двойное слово расширенной части кадра стека. Сие нам говорит о том, что компилятор разместил код, расширяющий кадр стека с выравниванием на четверное слово, но, при этом, используется только старшее двойное слово - "MyClass::x", а мнемоника "mov eax, dword ptr [rsp + 4]" говорит нам о том, что в clang квалификатор volatile напрочь отключает оптимизацию, как таковую, чего не происходит, например, в гнусе.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651366
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Да, что-то я забыл совсем, что о адресе возврата уже call сам заботится. Это если jmp юзать для вызова в новом кадре, то потребуются push и pop. А вот, кстати и ответ
wikipediaSince GCC version 4.5, the stack must be aligned to a 16-byte boundary when calling a function (previous versions only required a 4-byte alignment.)

push используется для CPU со stack engine как и последующие два mov'а, типа так более эффективно.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651403
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ, только мне непонятно зачем делать push/pop, когда после любой операции модификации "rsp" для выравнивания вполне достаточно сделать "and rsp, -16".
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651417
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы немного разбавить офтопик, небольшая ссылка по теме :)
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0847r0.html
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651583
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, если я правильно понимаю написанное, парни предлагают различать то, через что осуществляется доступ к членам/методам экземпляра класса (объекта) - через lvalue-ссылку или же через rvalue-ссылку с учётом cv-квалификаторов, а также использовать "this" в объявлении параметров метода в качестве ключевого слова для указания того, что дедукция шаблона должна осуществляться по типу lvalue/rvalue ссылки, через которую осуществляется доступ и, опять же, с учётом cv-квалификаторов.

Похоже, я не одинок в своих хотелках!
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651640
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпредлагают различать то, через что осуществляется доступ к членам/методам экземпляра класса (объекта) - через lvalue-ссылку или же через rvalue-ссылку с учётом cv-квалификаторов
Это уже есть начиная с С++11.
А остальное - да, предлагают.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39651665
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

спасибо за ссылку.
...
Рейтинг: 0 / 0
19 сообщений из 94, страница 4 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Константный экземпляр класса. Кто как делает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]