Ivan
я ассемблерный код не умею читать :(
Ivan
https://godbolt.org/g/C38mki
Berkus
warning: conversion from string literal to 'char *' is deprecated [-Wc++11-compat-deprecated-writable-strings]
Berkus
ну варнинг то понятный
cyberzx 🇷🇺
а чем тебя не устаривает?
struct W { char c[] = "abc"; }
Ivan
пока нормально тоже, устраивает
Berkus
movabs rax, .L.str
Berkus
оно всё равно берет только одну строку, и пишет тебе варнинг
Berkus
cyberzx 🇷🇺
в первом случае в структуре лежит указатель, а во втором - массив
Berkus
тоже указатель
Berkus
ты тип char[] знаешь? это char*
Ivan
Berkus
угу и инициализация сразу в 4 раза менее эффективная по командам и на порядок по доступу к памяти
Berkus
mov ax, word ptr [.L.str]
mov word ptr [rdi], ax
mov cl, byte ptr [.L.str+2]
mov byte ptr [rdi + 2], cl
Berkus
так себе
cyberzx 🇷🇺
ты тип char[] знаешь? это char*
В смысле? Котлеты отдельно, мухи отдельно. T[] это массив
http://en.cppreference.com/w/cpp/language/array
Если размер опущен, то он берётся из инициализатора
Berkus
Berkus
именно
Ivan
стоп стоп пацаны, вы отходите от темы
Ivan
http://cpp.sh/7c6te
cyberzx 🇷🇺
Ivan
у меня возникает вопрос. куда записалось "bca"?
Ivan
точнее, как выглядит наша память
Anonymous
посоветуйте средства разработки под плюсы в мак ос
Ivan
Статическая память struct { указатель на статическую память "аа" }
Ivan
далее берём, по указателю на статическую область на "аа", переписываем туда "bca"
Ivan
где это всё? что происходит?
Dmitry
Pavel
ты ни чего не переписываешь, у тебя просто char* word ссылается на другой кусок памяти
Berkus
Anonymous
спс
Ivan
Berkus
Ivan
ну ок)
Ivan
я спокоен
Berkus
вот если ты сделаешь word[0] = 'b';
Pavel
тогда будешь долго искать баги
Pavel
по поводу ide xcode под маком только я юзаю?
cyberzx 🇷🇺
может быть очень далеко
cyberzx 🇷🇺
можешь почитать SystemV ABI. Там все эти ньюансы описаны
http://math-atlas.sourceforge.net/devel/assembly/abi_sysV_amd64.pdf
Ivan
ну разница в скорости доступа если бы она лежала в куче или в статической памяти есть?
Pavel
теоритически нет, вроде
Pavel
стек таже память, просто с ней по другому работают
cyberzx 🇷🇺
cyberzx 🇷🇺
ну или что там под виндой
Ivan
разве когда вызываешь malloc не происходит куча запросов к ОС, по поводу дай мне память, она смотрит можно ли выделить тебе на этой странице памяти что-то, и так далее. Тут же на этапе компиляции, "bca" уже положили куда-то в статическую облатсь
cyberzx 🇷🇺
и? как по твоему загрузщик загружает твой .exe?
Ivan
он же просто меняет 0xAA5212 на другой 0x1598FF
Ivan
он же это делает один раз
Pavel
Pavel
дергается не часто
Ivan
ща
Ivan
struct W { char c[3] = ('a', 'b', 'c' }; };
Ivan
а, б, ц лежат так же далеко ?
Pavel
нет, они рядом лежат
Ivan
рядом со структурой?
cyberzx 🇷🇺
внутри структуры
cyberzx 🇷🇺
структура это и есть массив
Ivan
ок, все верно
Pavel
в твоем случае они есть вся структура + выравнивание
cyberzx 🇷🇺
sizeof(W) = 3; (без выранивания)
Ivan
доступ к ним будет быстрее, чем к struct W { char* = "abc"; };
Pavel
нет разницы
Berkus
Ivan
нет разницы
то есть похеру, что char* это похер в какой статической заднице лежит
Berkus
не похеру конечно
Ivan
ну вот я про это
Pavel
что значит доступ?
Ivan
спасибо, я могу спать спокойно :)
Ivan
лишний прыжок будет по указателю
Ivan
получается дешевле всего, размещать данные на стеке
Ivan
потом в статической памяти
Berkus
в случае с массивом у тебя есть адрес W и там сразу лежит строка, в случае с указателем по адресу W лежит указатель, по которому уже лежит строка
Ivan
потом в куче