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
оно всё равно берет только одну строку, и пишет тебе варнинг
cyberzx 🇷🇺
в первом случае в структуре лежит указатель, а во втором - массив
Berkus
тоже указатель
Berkus
ты тип char[] знаешь? это char*
Ivan
ты тип char[] знаешь? это char*
только создаётся на стеке
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
так себе
Ivan
а чем тебя не устаривает? struct W { char c[] = "abc"; }
http://cpp.sh/7c6te в случае с char* я могу значение строки менять, в случае с char[] ошибка компиляции
cyberzx 🇷🇺
ты тип char[] знаешь? это char*
В смысле? Котлеты отдельно, мухи отдельно. T[] это массив http://en.cppreference.com/w/cpp/language/array Если размер опущен, то он берётся из инициализатора
cyberzx 🇷🇺
только создаётся на стеке
Не на стеке. Создаётся он там, где создаётся объект. На хипе или в статической памяти
Berkus
именно
Ivan
стоп стоп пацаны, вы отходите от темы
Ivan
http://cpp.sh/7c6te
cyberzx 🇷🇺
<source>:4:14: error: array bound cannot be deduced from an in-class initializer
ну это когда инициализируется в классе. напиши там размер и он выведется
Ivan
у меня возникает вопрос. куда записалось "bca"?
Ivan
точнее, как выглядит наша память
Anonymous
посоветуйте средства разработки под плюсы в мак ос
Ivan
Статическая память struct { указатель на статическую память "аа" }
Ivan
далее берём, по указателю на статическую область на "аа", переписываем туда "bca"
Ivan
где это всё? что происходит?
Pavel
ты ни чего не переписываешь, у тебя просто char* word ссылается на другой кусок памяти
Anonymous
спс
Ivan
ну ок)
Ivan
я спокоен
Berkus
вот если ты сделаешь word[0] = 'b';
Pavel
тогда будешь долго искать баги
Pavel
по поводу ide xcode под маком только я юзаю?
Ivan
ты просто поменял указатель же
а память где сами переменные лежат "bca" далеко от места, где лежит указатель на "bca"?
cyberzx 🇷🇺
может быть очень далеко
cyberzx 🇷🇺
можешь почитать SystemV ABI. Там все эти ньюансы описаны http://math-atlas.sourceforge.net/devel/assembly/abi_sysV_amd64.pdf
Ivan
ну разница в скорости доступа если бы она лежала в куче или в статической памяти есть?
Pavel
теоритически нет, вроде
Pavel
стек таже память, просто с ней по другому работают
cyberzx 🇷🇺
ну или что там под виндой
Ivan
разве когда вызываешь malloc не происходит куча запросов к ОС, по поводу дай мне память, она смотрит можно ли выделить тебе на этой странице памяти что-то, и так далее. Тут же на этапе компиляции, "bca" уже положили куда-то в статическую облатсь
cyberzx 🇷🇺
и? как по твоему загрузщик загружает твой .exe?
Ivan
он же просто меняет 0xAA5212 на другой 0x1598FF
Ivan
он же это делает один раз
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
по поводу ide xcode под маком только я юзаю?
нет, но просто под плюсы писать оно не особо нужно, плюс там проекты ебанутые
Berkus
Ivan
нет разницы
то есть похеру, что char* это похер в какой статической заднице лежит
Berkus
не похеру конечно
Ivan
ну вот я про это
Pavel
что значит доступ?
Ivan
спасибо, я могу спать спокойно :)
Ivan
лишний прыжок будет по указателю
Berkus
что значит доступ?
разыменование указателя
Ivan
получается дешевле всего, размещать данные на стеке
Ivan
потом в статической памяти
Berkus
в случае с массивом у тебя есть адрес W и там сразу лежит строка, в случае с указателем по адресу W лежит указатель, по которому уже лежит строка
Ivan
потом в куче