Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi >> C++, Переход 
:(
    Опции темы
MAKCim
Дата 27.11.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Значит таки я был прав когда сказал практически любые вместо любые

неа  smile 
зачем тебе, если ты, например, пишешь под IA-32 использовать команды UltraSPARC?
если у тебя 32 битная версия Delphi, то, как ни крути, использовать специфичные инструкции, скажем для Athlon64, ты не сможешь, но IA-32 он будет реализовывать полностью
Так что, если есть компилятор под данную платформу и в нем поддерживается встраиваемый ассемблерный код, то любая задача для этой платформы тебе по плечу  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 29.11.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Я так полагаю, делфисты поняли, что с С++ им рано тягаться и тема постепенно умерла  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.11.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  24.11.2006,  21:00 Найти цитируемый пост)
в ядре Linux есть такая важная (очень важная) переменная как jiffies, так вот 
объявлена она
extern unsigned long volatile __jiffy_data jiffies;

я не юзаю пока линукс!
но в винде вот этот код
Код

#include <iostream.h>
#pragma argsused
//volatile
int y;
void inside(int x)
{
  //volatile
  int xy=12;
  cout<<"inside"<<endl;
  cout<<x<<endl;
  cout<<xy<<endl;
}
int main(int argc, char* argv[])
{

  y=1;
        cout<<"outside"<<endl;
        cout<<y<<endl;
        inside(y);
        y++;
        cout<<"outside"<<endl;
        cout<<y<<endl;
        cin.get();
        return 0;
}

и в любом месте с расскоментированым volatile дает одинаковый код даже на асме!!!
я понимаю , что это не совсем корректно, но разработкой драйверов под винду я занимался очень слабо, и еще не разу не видел где volatile был необходим, может еще не все посмотрел!
Так что имхо это не совсем правильно , но это ответ , изменения асм кода, от присутствия и отсутствия volatile нет!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 29.11.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(MAKCim @  29.11.2006,  09:56 Найти цитируемый пост)
Я так полагаю, делфисты поняли, что с С++ им рано тягаться и тема постепенно умерла  smile

Да нет, просто мой пост уже кто-то снес или инет заглючил smile.

Цитата(MAKCim @  27.11.2006,  18:31 Найти цитируемый пост)
если у тебя 32 битная версия Delphi, то, как ни крути, использовать специфичные инструкции, скажем для Athlon64, ты не сможешь, но IA-32 он будет реализовывать полностью


Это же было только пример, это не единственное чего не поддерживает встроенный ассемблер.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SergeCpp
Дата 29.11.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 3
Всего: 124



PM MAIL WWW ICQ   Вверх
MAKCim
Дата 29.11.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

я понимаю , что это не совсем корректно

все корректно
просто volatile гарантирует получение значение из памяти
в его отсутствии такой гарантии нет

Добавлено @ 10:28 
SergeCpp
как всегда в тему  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(skyboy @  24.11.2006,  20:19 Найти цитируемый пост)
procedure some(arg: array of byte);
var little: array of string;
      i:longint;
begin
arg[0]:= 5;
arg[length(arg) - 1]:= length(arg);
setlength(little,length(arg));
for i:=1 to length(arg) do
 little[i - 1]:= IntToStr(arg[i - 1]);
end;


Цитата(MAKCim @  24.11.2006,  21:00 Найти цитируемый пост)
кажись это динамические массивы
приведи asm код, сразу станет видно

асма там много , а вот пас код пазям
Код

procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: Longint; lengthVec: PLongint);
var
  i: Integer;
  newLength, oldLength, minLength: Longint;
  elSize: Longint;
  neededSize: Longint;
  p, pp: Pointer;
begin
  p := a;

  // Fetch the new length of the array in this dimension, and the old length
  newLength := PLongint(lengthVec)^;
  if newLength <= 0 then
  begin
    if newLength < 0 then
      Error(reRangeError);
    DynArrayClear(a, typeInfo);
    exit;
  end;

  oldLength := 0;
  if p <> nil then
  begin
    Dec(PLongint(p));
    oldLength := PLongint(p)^;
    Dec(PLongint(p));
  end;

  // Calculate the needed size of the heap object
  Inc(PChar(typeInfo), Length(PDynArrayTypeInfo(typeInfo).name));
  elSize := PDynArrayTypeInfo(typeInfo).elSize;
  if PDynArrayTypeInfo(typeInfo).elType <> nil then
    typeInfo := PDynArrayTypeInfo(typeInfo).elType^
  else
    typeInfo := nil;
  neededSize := newLength*elSize;
  if neededSize div newLength <> elSize then
    Error(reRangeError);
  Inc(neededSize, Sizeof(Longint)*2);

  // If the heap object isn't shared (ref count = 1), just resize it. Otherwise, we make a copy
  if (p = nil) or (PLongint(p)^ = 1) then
  begin
    pp := p;
    if (newLength < oldLength) and (typeInfo <> nil) then
      FinalizeArray(PChar(p) + Sizeof(Longint)*2 + newLength*elSize, typeInfo, oldLength - newLength);
    ReallocMem(pp, neededSize);
    p := pp;
  end
  else
  begin
    Dec(PLongint(p)^);
    GetMem(p, neededSize);
    minLength := oldLength;
    if minLength > newLength then
      minLength := newLength;
    if typeInfo <> nil then
    begin
      FillChar((PChar(p) + Sizeof(Longint)*2)^, minLength*elSize, 0);
      CopyArray(PChar(p) + Sizeof(Longint)*2, a, typeInfo, minLength)
    end
    else
      Move(PChar(a)^, (PChar(p) + Sizeof(Longint)*2)^, minLength*elSize);
  end;

  // The heap object will now have a ref count of 1 and the new length
  PLongint(p)^ := 1;
  Inc(PLongint(p));
  PLongint(p)^ := newLength;
  Inc(PLongint(p));

  // Set the new memory to all zero bits
  FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);

  // Take care of the inner dimensions, if any
  if dimCnt > 1 then
  begin
    Inc(lengthVec);
    Dec(dimCnt);
    for i := 0 to newLength-1 do
      DynArraySetLength(PPointerArray(p)[i], typeInfo, dimCnt, lengthVec);
  end;
  a := p;
end;

ReallocMem
и
GetMem
работа с дин памятью

Добавлено @ 10:35 
Цитата(MAKCim @  29.11.2006,  09:27 Найти цитируемый пост)
просто volatile гарантирует получение значение из памяти
в его отсутствии такой гарантии нет

а почему тогда гарантии нет?
SergeCpp, полистаю спб


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SergeCpp
Дата 29.11.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 3
Всего: 124



user posted image
Modern C++ Design by Andrei Alexandrescu

PM MAIL WWW ICQ   Вверх
MAKCim
Дата 29.11.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



вот например такой код
Код

...
int i = 0;
int a, b, c, d;
a = i;
b = i;
c = i;
d = i;

компилятор мог бы оптимизировать так
Код

...
movl  (%esp), %eax
movl  %eax, -4(%esp)
// например тут извне (как - не важно) изменяется значение
// по адресу (%esp), а в регистре по-прежнему осталось старое значение
// соответственно дальнейший код будет содержать логическую ошибку - 
// ее обнаружить будет крайне сложно - иногда отрабатывает
// правильно, иногда все падает  :) 
movl  %eax, -8(%esp)
movl  %eax, -12(%esp)
movl  %eax, -16(%esp)
subl  $16,  %esp
...

в случае 
Код

...
volatile int i = 0;
int a, b, c, d;
a = i;
b = i;
c = i;
d = i;

будет так
Код

...
movl  (%esp), %eax
movl  %eax, -4(%esp)
movl  (%esp), %eax
movl  %eax, -8(%esp)
movl  (%esp), %eax
movl  %eax, -12(%esp)
movl  (%esp), %eax
movl  %eax, -16(%esp)
subl  $16,  %esp
...


Это сообщение отредактировал(а) MAKCim - 29.11.2006, 10:48


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.11.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



SergeCpp, это к чему?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MAKCim
Дата 29.11.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

а почему тогда гарантии нет?

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

Это сообщение отредактировал(а) MAKCim - 29.11.2006, 10:57


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.11.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  29.11.2006,  09:40 Найти цитируемый пост)
возможно кэширование в регистре, что не всегда желательно

пример можно?

Добавлено @ 11:18 
MAKCim, давай раз уж мы говорим о дельфи и С++ (то подразумеваем , что все на платформе вин32)
то будем асм приводить не так как это делается в юниксе , мне мало чего понятно из твобою приведеного кода!
и плюс
Цитата(Romikgy @  29.11.2006,  09:07 Найти цитируемый пост)
это ответ , изменения асм кода, от присутствия и отсутствия volatile нет! 

проверял на с++ билдере!

Это сообщение отредактировал(а) Romikgy - 29.11.2006, 11:05


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 29.11.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Код

void v1()
{
 int i = 0;
int a, b, c, d;
a = i;
b = i;
c = i;
d = i;
}
void v2()
{
volatile int i = 0;
int a, b, c, d;
a = i;
b = i;
c = i;
d = i;
}

вот код аналогичный твоему
вот что дал асм билдера
user posted image
как видишь разницы нет


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MAKCim
Дата 29.11.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

мне мало чего понятно из твобою приведеного кода!

Код

mov  EAX, [ESP]
mov  [ESP - 4], EAX
mov  [ESP - 8], EAX
mov  [ESP - 12], EAX
mov  [ESP - 16], EAX
sub   ESP, 16

Код

mov  EAX, [ESP]
mov  [ESP - 4], EAX
mov  EAX, [ESP]
mov  [ESP - 8], EAX
mov  EAX, [ESP]
mov  [ESP - 12], EAX
mov  EAX, [ESP]
mov  [ESP - 16], EAX
sub   ESP, 16

Цитата

пример можно?

какой пример тебе нужен?
все зависит от компилятора, НО
voaltile гарантирует поведение аналогичное 2-му ассемблерному листингу этого поста
Цитата

как видишь разницы нет 

а где-то будет разница, неужели это не понятно?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SergeCpp
Дата 29.11.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 3
Всего: 124



Цитата(Romikgy @  29.11.2006,  13:27 Найти цитируемый пост)
как видишь разницы нет
А это не отладочная ли была компиляция?.. user posted image

А вот VC++ 6 — Release (оптимизация включена)
Код
PUBLIC    ?v1@@YIXXZ                    ; v1
_TEXT    SEGMENT
?v1@@YIXXZ PROC NEAR                    ; v1

; 100  : int i = 0;
; 101  : int a, b, c, d;
; 102  : a = i;
; 103  : b = i;
; 104  : c = i;
; 105  : d = i;
; 106  : }

  00210    c3         ret     0
?v1@@YIXXZ ENDP                        ; v1
_TEXT    ENDS

Код
PUBLIC    ?v2@@YIXXZ                    ; v2
_TEXT    SEGMENT
_i$ = -4
?v2@@YIXXZ PROC NEAR                    ; v2

; 108  : {

  00220    51         push     ecx

; 109  : volatile int i = 0;

  00221    c7 44 24 00 00
    00 00 00     mov     DWORD PTR _i$[esp+4], 0

; 110  : int a, b, c, d;
; 111  : a = i;

  00229    8b 44 24 00     mov     eax, DWORD PTR _i$[esp+4]

; 112  : b = i;

  0022d    8b 4c 24 00     mov     ecx, DWORD PTR _i$[esp+4]

; 113  : c = i;

  00231    8b 54 24 00     mov     edx, DWORD PTR _i$[esp+4]

; 114  : d = i;

  00235    8b 44 24 00     mov     eax, DWORD PTR _i$[esp+4]

; 115  : }

  00239    59         pop     ecx
  0023a    c3         ret     0
?v2@@YIXXZ ENDP                        ; v2


Это сообщение отредактировал(а) SergeCpp - 29.11.2006, 12:04
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.