Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2014, 08:54   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Возвращение указателя на объект вместо самого объекта. Как долго протянет?

Отталкиваюсь от того, что можно возвращать пойнтер вместо копии самого объекта, это быстрее. Рекорд на низком уровне вызывает CopyRecord и перетаскивает данные; вайдстрины звонят мэнеджеру и также просят создать временный дубликат(WStrAsg). Лишь классы ничего не требуют, они переменные пойнтеров или че-то там, не знаю.

Резонно ли это?
На примере с WideString:

Код:
type
TVectorWSTR = class(TNonReferenceCountedInterfacedObject, IVectorWSTR)
  private type
    TWStr = record
      FWideString   : WideString;
      FSignedHash   : UINT;
      FUnsignedHash : UINT;
    end;
  private
    FList     : array of TWStr;
    FCount    : Integer;
    FCapacity : Integer;
    function Get(const Index:Integer):PWideString;stdcall;INLINE;
.........
implementation

function TVectorWSTR.Get(const Index:Integer):PWideString;
begin Result := @FList[Index].FWideString;end;
.........
Возвращаю PWideString в локал переменнную, может ли она перестать быть актуальной? Например, если сразу после этого я че-то делаю с другими строками, которые звонят менджеру, у них проходит совещание и принято решение и глобальной реаллокации. После этого переменная PWideString начнет показывать на другую строку или вообще станет указывать на мусор и т.п. И это после какой-нибудь внезапной строчки кода(в пределах одной функции, процедуры - не дальше). Какого шансы в целом?

Ну и для целых рекордов тот же вопрос)
WhiskasTM вне форума Ответить с цитированием
Старый 07.10.2014, 08:58   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Если ты оперируешь указателями, то на тебе и лежит забота о том, чтобы они указывали на правильные данные, а не куда-нибудь в космос.

И никак иначе - следить за этим, кроме самого программиста, некому.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.10.2014, 11:18   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Грубо говоря unmanaged type(как в си пишут)? Память двигается живет, а указатель все туда же смотрит.

Просто тут недавно было... посылаю пойнтеры на рекорды(цикл), там нужно было в них че-то записать и AV на N-ый раз - в дебаггере пытается писать в адрес 25. Заменил на var - все окей стало.

Кажется понял, переменные(те же пойнтеры) просто контролируются мэнэджером, а все что выше - нет.

Наверно, отсюда же все PWideChar в винапи, мол, это ТЫ изменил строку или твой мэнэджер перенес данные, а винда не при чем
WhiskasTM вне форума Ответить с цитированием
Старый 07.10.2014, 11:26   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Это ты щас с кем разговаривал?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.10.2014, 11:55   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Аффтар, ты или теорию почитай, или ассемблерный подстрочник посмотри. И классы, и строки -- уже указатели. Зачем указатели на указатели городить?
Vapaamies вне форума Ответить с цитированием
Старый 07.10.2014, 12:10   #6
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Хотел от System.@WStrAsg и CopyRecord избавится. Сезон охоты за тактами - тссс, вон ещё парочка припряталась...
WhiskasTM вне форума Ответить с цитированием
Старый 07.10.2014, 12:17   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
может ли она перестать быть актуальной?
Перестанет быть актуальной только если вы её потеряете или указатель станет равным nil(Вы или другой поток изменили этот указатель).
Человек_Борща вне форума Ответить с цитированием
Старый 07.10.2014, 12:19   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сезон охоты за тактами - тссс, вон ещё парочка припряталась...
Делириум тременс... Тяжёлый случай.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.10.2014, 12:21   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от WhiskasTM Посмотреть сообщение
Хотел от System.@WStrAsg и CopyRecord избавится.
_WStrAsg -- инкапсуляция механизма подсчета ссылок BSTR, оберткой над которыми и является WideString. Внимание, вопрос: зачем избавляться от подсчета ссылок?

А от CopyRecord избавляются наибанальнейшим способом -- ставят const или var перед параметром процедуры. Запись передается по ссылке, контролируемой компилятором.
Vapaamies вне форума Ответить с цитированием
Старый 07.10.2014, 12:23   #10
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

min@y™, Ложи и провокация! Сезон не длится не вечно. Просто часть завершена, почему бы не швырнутся

Vapaamies, ссылки? _WStrAsg же присвоение, типа вот те строка, запихни её туда. Хотя посмотрю теперь.

edit:

Если Get метод возвращает WideString:
Код:
FMain.pas.65: x := sl[0];
lea rcx,[rbp+$20]
mov rax,[rel $0006a0f2]
mov rax,[rax+$10]
mov rdx,[rax]
call @WStrLAsg
lea rcx,[rbp+$28]
mov rdx,[rbp+$20]
call @WStrLAsg
nop
Если Get метод возвращает PWideString:
Код:
FMain.pas.65: x := sl.Get(0)^;
mov rax,[rel $0006a12e]
mov [rbp+$20],rax
lea rcx,[rbp+$28]
mov rax,[rbp+$20]
mov rax,[rax+$10]
mov rdx,[rax]
call @WStrLAsg
nop
Минус один WStrLAsg. А... он с "L" ещё. 2-й вариант быстрее в 2 раза.

Последний раз редактировалось WhiskasTM; 07.10.2014 в 12:36.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение указателя на структуру millepetrozza Помощь студентам 2 15.03.2013 20:34
Возвращение из функции указателя на двумерный массив _J_ Общие вопросы C/C++ 2 29.12.2011 01:34
Возвращение ссылки на объект kesha2008 C# (си шарп) 5 29.05.2011 16:26
Возвращение массива записей через объект CodeNOT PHP 8 14.04.2011 18:30
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37