BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Защо променлива и непроменлива сочат еднакъв адрес
SuN
Публикувано на: 07-09-2019, 21:27
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9175
Регистриран на: 27.01.05



Проследих това поведение до излизането на F# 4.0 и се учудвам, че работи така[1]:
QUOTE (fsharp interactive)

open System

let a = 42
let mutable b = a
b <- a
Object.ReferenceEqual (a, b ) // връща ИСТИНА


Това се случва и с аргументите на функции, за които очаквам да са копия на нещо и да не се променят току-така (не че ще ги ползвам, ама да са си там в оригинален вид). Идеи защо това е направено така? Дали пък не е глупав бъг оправен в по-късни версии?

[1] https://devblogs.microsoft.com/fsharpteam/a...ols-in-vs-2015/

Това мнение е било редактирано от SuN на 07-09-2019, 21:29


--------------------
Само аз не троля.
PMEmail Poster
Top
ici
Публикувано на: 07-09-2019, 21:58
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 16435
Регистриран на: 06.06.04



Вероятно е същото като в питоня. Имената а,б се закачат на инстанция на обекти които са имутабле. Ако промениш "променливата" се създава нова инстанция която се достъпва през същото име. Промени б и виж тогава.

CODE
*** Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32. ***
*** Remote Python engine is active ***
>>> a = 5
>>> id(a)
1531208864
>>> b = a
>>> id(b)
1531208864
>>> id(a) == id(b)
True
>>> b = 12
>>> id(b)
1531208976
>>> id(a) == id(b)
False
>>>


Това мнение е било редактирано от ici на 07-09-2019, 22:02


--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 07-09-2019, 22:08
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9175
Регистриран на: 27.01.05



Не, след промяната на "b" продължават да сочат към едно и също място, което е променено. Мислех, че е излишно да го пиша.

Открих проблема точно като променя "копие" на аргумент на функция, но в една проверка по погрешка бях оставил името за аргумента и се учудих, че сработваше.

Като го помислих още малко от написаното в секция "Simplified use of mutable values" от анонса, това е някакво изхакано положение за да им е удобно на програмистите, които ползват често F#. Другите да му се радват. icon_smile.gif


За обикновени променливи е така, както предполагаш. В моята програма разбира се беше масив, а аз променях отделни елементи. icon_smile.gif

В моя случай "a" и "b" продължават да сочат към един и същи масив, с променен елемент.

Това мнение е било редактирано от SuN на 07-09-2019, 22:12


--------------------
Само аз не троля.
PMEmail Poster
Top
ici
Публикувано на: 07-09-2019, 22:12
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 16435
Регистриран на: 06.06.04



Нещо не си догледал. След като промениш б, отпечати б и а. Само че промени б с нещо друго, не с а пак. icon_smile.gif


Това мнение е било редактирано от ici на 07-09-2019, 22:16


--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 07-09-2019, 22:16
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9175
Регистриран на: 27.01.05



Абе, че бъркам копчетата вече е ясно, но ми се струва, че съм прав. icon_smile.gif

Прикачена картинка (Кликнете на картинката, за да я увеличите!)
Прикачена картинка


--------------------
Само аз не троля.
PMEmail Poster
Top
ici
Публикувано на: 07-09-2019, 22:17
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 16435
Регистриран на: 06.06.04



И в питоня е така. Всички променливи по принцип са имутабле, само list не е. Когато го предаваш като параметър се използва като "static" в С когато е default стойност и други подобни трикове. Има много написано как да настъпваш мотики с List. Виж си документацията за Ф# Аррай.

ПП. Като ти гледам картинката сигурно лежиш на една страна и с мазна ръка от пържени картофи натискаш някакви копчета. Да не искаш да си изкривим врата за да видим какво пише там?

Това мнение е било редактирано от ici на 07-09-2019, 22:20


--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 07-09-2019, 22:27
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9175
Регистриран на: 27.01.05



Исках да се почувствам млад. :/

Ще гледам документацията, макар в уроците от fsharp for profit да не помня да е имало такива завъртания примери с паметта. Някаква уловка ми се струва. Макар, че като се позамислих и в емакс лисп масивите (а май и списъците бяха тъй) може да се променят все едно работиш със Ц масив.

Ще го пробвам и в ocaml за видя дали е същата простотия. Ако исках да променям случайни места от паметта можех и на Ц да си пиша.


--------------------
Само аз не троля.
PMEmail Poster
Top
SuN
Публикувано на: 08-09-2019, 09:45
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9175
Регистриран на: 27.01.05



Добре, няма драма. За първи път явно ползвам масиви така в езика и съм се объркал, че неизменяемостта (immutability) на променливите е същото като това те да са константи.

Това мнение е било редактирано от SuN на 08-09-2019, 09:45


--------------------
Само аз не троля.
PMEmail Poster
Top
gat3way
Публикувано на: 08-09-2019, 21:26
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4173
Регистриран на: 22.06.12



Мяза на некаква copy on write схема, сходно нещо става когато форкнеш дъщерен процес, първоначално адресните му пространство в едно към едно същите страници физическа памет, мапната на същите виртуални адреси като родителя, но бутнеш ли нещо, кернела почва една тарапана с мапване на нова страница памет, копиране на съдържанието от родителската и мазането отгоре, това изглежда като безмислен труд, но разбира се копирането на цялото адресно пространство на родителския у нови страници памет и мапването им при форкване е далеч по-голямо разхищение и повече труд. Може би има някакви worst кейсове където дъщерния бута по 1-2 байта във всяка страница памет, "унаследена" от родителя, където това вече не излиза на далавера, но в общия случай така е по-добре.
PMEmail Poster
Top
Stilgar
Публикувано на: 09-09-2019, 00:32
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 12645
Регистриран на: 13.05.08



В тоя случай дето е кода е особено идиотско защото оригиналните променливи са int и са на стека. С тоя referenceequals форсираш boxing и (вероятно някакъв pool), който на практика никога не се случва в реална програма щото никога не присвояваш int на object.

Това мнение е било редактирано от Stilgar на 09-09-2019, 00:33


--------------------
Опитахме се да го направим както трябва, но стана както винаги.
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0