Size: a a a

2019 December 10

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Sergey Smyshlyaev
Это другое. Copy-on-write это когда у нас иммутабельная коллекция, при записи в которую создаётся полная копия с изменённым полем.
Причем я даже не спорю с этим определением, просто оно с другого уровня
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
На уровне C++ движка нет “иммутабельных коллекций”, есть указатели на память, области памяти и т.д.
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Если иммутабельность не нужна, зачем вообще копировать? Самый быстрый по перформансу способ - мучать общую память не заботясь о корректности.
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Это просто способ оптимизации работы с памятью
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Nick Shevrov
На уровне C++ движка нет “иммутабельных коллекций”, есть указатели на память, области памяти и т.д.
Что такое «движок»? Рантайм? Не важно, иммутабельные коллекции - это всегда библиотека, стандартная или сторонняя.
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Движок — V8
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Интерфейс движка в JS — String
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Имплементация — с 10ок классов в С++ коде
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Nick Shevrov
Это просто способ оптимизации работы с памятью
Оптимизация памяти через полное копирование объектов - это прям очень крутая оптимизация
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Где ты увидел, что там выполняется копирование?)
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
COPY on write
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Есть 2 пути:
- копировать память сразу, как только ты программно создал новую сущность
- копировать по необходимости — COW
источник

NS

Nick Shevrov in JSNN 🤔 (GSNN)
Копирование все равно необходимо
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Нет, если тебе не нужна иммутабельность ты просто даёшь ссылку на объект и его совместно меняют
источник

ОХ

Олег Хлевнов in JSNN 🤔 (GSNN)
Если тебе нужна копия объекта, но ты не уверен, что когда-либо будешь ее менять -- объект можно не копировать. Для этого и сущестуют такие оптимизации. Копия будет создаваться только при изменении
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Так, ты только что рассказал что такое COW, хорошо что ты это понимаешь. Как это относится к структурному шарингу при взятии подстроки?
источник

ОХ

Олег Хлевнов in JSNN 🤔 (GSNN)
const a = "asd";
const b = a;
print(a); // Используется буфер а
print(b); // Используется буфер а, строка одна и та же
b[1] = "q";
print(a); // Используется буфер а
print(b); // Используется буфер b, строка тихонько скопировалась
источник

ОХ

Олег Хлевнов in JSNN 🤔 (GSNN)
Если ты берешь подстроку, но не модифицируешь ее -- логично просто взять ссылку на первый элемент и длину, и использовать буфер от старой строки. Если ее надо будет поменять, как в примере выше -- придется копировать
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
a и b в твоём примере это ссылки, объект в памяти один
источник

SS

Sergey Smyshlyaev in JSNN 🤔 (GSNN)
Ты можешь модифицировать объект как через ссылку a так и через ссылку b
источник