Re[3]: Порядок вычисления аргументов
От: 0x7be СССР  
Дата: 11.10.10 09:33
Оценка: 6 (1) +3
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Socrat, Вы писали:


ВВ>Интересно, а это особенность реализации или стандарт?

Стандарт явно указывает, что порядок вычисления параметров может быть любым.
Re: Порядок вычисления аргументов
От: Socrat Россия  
Дата: 11.10.10 08:51
Оценка: 6 (1) -1
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


ВВ>Вопросы:

ВВ>- Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости" списка аргументов вылет будет происходить не "в том месте".
ВВ>- Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?

В сях аргументы заталкиваются в стек, начиная с последнего. Вычисляются они тоже чаще всего соответственно.
Re[4]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 15:05
Оценка: +2
G>Но я лично сильно в этом сомневаюсь. Причины две.
G>1) Нижележащие API (в частности, ОС) и библиотеки (включая динамические) могут быть написаны на разных языках, отличных от целевого, и уже поэтому convention неразумно делать частью стандарта конкретного языка. Создаст лишние сложности.
G>2) Закладка в программе на порядок вычисления аргументов функции — сама по себе очень плохая практика. Это неочевидно, и хрен поймешь.

И стоит добавить третью причину. Если конвеншн определяет порядок вычисления — это сильно ограничивает современные оптимизаторы для компилируемых языков.

К примеру, компилятор может решить устроить замес из вычисления выражений в аргументах, с целью оптимально нагрузить конвейер. И если регистров дофига, и проц суперскалярно-конвейерный, то хороший компилятор так и поступит.

А если вызовы функций стоят в аргументах — он до кучи может решить их проинлайнить. Так может и JIT поступить в динамике.

А вот во времена Win 3.11 было все четко. Как в конвеншне указано положение в стеке — в таком порядке и считается. Ибо регистров мало, и один хрен не более одной инструкции за такт.
Re[5]: Порядок вычисления аргументов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.10.10 22:40
Оценка: 28 (1)
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>В С++ неважно слева направо или наоборот, т.к. в общем случае неопределен порядок вычисления подвыражений. Поэтому, например, в таком коде:


ЮЖ>>
ЮЖ>>typedef std::auto_ptr<T> ptr;
ЮЖ>>void foo(ptr a, ptr b);
ЮЖ>>//...
ЮЖ>>foo( ptr(new T), ptr(new T) );


ЮЖ>>присутствует потенциальная утечка.


S>А что здесь куда утечет?


компилятор вправе сделать так (псевдокод):

T* v1 = new T;
T* v2 = new T; // 1

ptr p1(v1);
ptr p2(v2);

foo(p1, p2);


Если в точке 1 возникнет исключение (недостаточно памяти), то объект, на который указывает v1 не будет удален. Сalling convention здесь роли не играет.
Re: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.10.10 09:09
Оценка: 12 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


ВВ>Вопросы:

ВВ>- Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости" списка аргументов вылет будет происходить не "в том месте".
может быть чревато разным поведением побочных эффектов.

ВВ>- Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?

http://msdn.microsoft.com/en-us/library/984x0h58%28VS.80%29.aspx
Re[19]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 21:51
Оценка: 7 (1)
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Gaperton, Вы писали:


G>>Ты путаешь, Павел. Он не согласился с тобой, а просто проявил в разговоре с тобой вежливость.


S>На самом деле я действительно согласился. Моя осведомленность в обсуждаемых материях представляет собой экстраполяцию домыслов. Можно считать что Павел проявил проницательность.


То, что вы согласились — большой плюс Вам. Но не Павлу.

Отыскивать маленькие недостатки — издавна свойство умов, которые мало или вовсе не возвышались над посредственностью. Возвышенные умы молчат или же возражают против целого, а великие умы творят сами, никого не осуждая.


Г. Лихтенберг
Re[3]: Порядок вычисления аргументов
От: Socrat Россия  
Дата: 11.10.10 09:01
Оценка: 6 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Интересно, а это особенность реализации или стандарт?


Зачем так сделано — я не знаю. Единственное, что приходит на ум — функции с переменным количеством параметров, например, printf. Поскольку в них обработка идет с первого параметра, то логично, что он будет последним заталкиваться в стек.

ВВ>Студии у меня под рукой нет, я так понимаю, что — положим, в VC — вызов функции вида foo(x, y), где оба аргумента являются невычисляемыми (приводят к ошибке), вылетит на вычислении именно у?


Не знаю, вполне возможно, что порядок вычисления параметров может меняться. Особенно, если используется быстрый вызов функций, когда параметры кладутся в регистры.
Re: Порядок вычисления аргументов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.10.10 10:57
Оценка: 6 (1)
вызов функций справа налево нарушает укоренившуюся привычку программиста писать код слева направо.

допустим есть функции:
bool print(string text) // которая выводит текст, и возвращает ошибку через результат: true - ok, false - error
bool and(params bool[] vals) //обычный and от нескольких параметров


тогда естественно будет написать:
if (and(print("Hello"), print(" "), print("World"), print("!")))
{
  //ok
}
else
{
  //error
}

что при обратном вызове функций приведет к странному результату.
Re[3]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 14:39
Оценка: 6 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Вопрос можно поставить по-другому — есть ли энергичные языки, в которых порядок вычисления аргументов справа налево определен в стандарте — при том, что порядок вычисления остальных операций стандартный?


А. В такой постановке — черт его знает.

Но я лично сильно в этом сомневаюсь. Причины две.
1) Нижележащие API (в частности, ОС) и библиотеки (включая динамические) могут быть написаны на разных языках, отличных от целевого, и уже поэтому convention неразумно делать частью стандарта конкретного языка. Создаст лишние сложности.
2) Закладка в программе на порядок вычисления аргументов функции — сама по себе очень плохая практика. Это неочевидно, и хрен поймешь.

Поэтому, включать порядок вычисления аргументов в стандарт — никакой пользы кроме вреда. Не думаю, что удастся найти такой язык. Разве что поискать среди ранних, вроде Fortran-ов. Он крив как турецкая сабля. Но в те времена и стандартов-то на языки не было .
Re[3]: Порядок вычисления аргументов
От: FR  
Дата: 12.10.10 18:54
Оценка: 2 (1)
Здравствуйте, samius, Вы писали:

B>>Есть языки с так называемым "ленивым вычислением". Там аргументы вычисляются не при вызове функции, а при первом применении параметра. Т.е. их вычисление может вообще не понадобиться.


S>Речь об энергичном языке.


В некоторых энергичных языках есть ленивые параметры http://www.digitalmars.com/d/2.0/lazy-evaluation.html
Re: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 13:22
Оценка: -1
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


Стандарты подавляющего большинства языков не определяют этот порядок.

То, в каком порядке это происходит — это относится не к языку, а к так называемому calling convention.
http://en.wikipedia.org/wiki/X86_calling_conventions

ВВ>Вопросы:

ВВ>- Есть ли какие-нибудь языки с подобными извращениями?

Конечно. Например, так происходит при "pascal calling convention".

Ты можешь указать тип convention в своей программе на C++ при определении функции, так что язык тут не причем.

И это не самый странный convention. Вот, например, fastcall, при котором возможна ситуация, когда стек вообще не задействуется. Более того, компилятор имеет полное право воткнуть fastcall автоматически, если решит, что так лучше.

fastcall
Conventions entitled fastcall have not been standardized, and have been implemented differently, depending on the compiler vendor[1]. Typically fastcall calling conventions pass one or more arguments in registers which reduces the number of memory accesses required for the call.
Microsoft fastcall
Microsoft or GCC [2] __fastcall[3] convention (aka __msfastcall) passes the first two arguments (evaluated left to right) that fit into ECX and EDX. Remaining arguments are pushed onto the stack from right to left.
Borland fastcall
Evaluating arguments from left to right, it passes three arguments via EAX, EDX, ECX. Remaining arguments are pushed onto the stack, also left to right [4].
It is the default calling convention of Borland Delphi, where it is known as register.

Re[21]: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 12.10.10 13:03
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, k.o., Вы писали:


KO>>Мне, на самом деле, интересно почему стоит поступать согласно упомянутым "канонам". Единственная упомянутая причина показалась мне неубедительной и я, всего-лишь, попытался объяснить почему. Прошу прощения, если это выглядит как начало флейма.


PD>Я же уже сказал : не хочешь — не надо. Что мне еще добавить ?


Я же не просил ничего добавлять, не хочешь — не надо.
Re[19]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 16:52
Оценка: :)
Здравствуйте, Pavel Dvorkin, Вы писали:

Вообще, давненько вообще мы с тобой не зацеплялись .

Предлагаю замять. Извини, Павел .

Но тока это, что больше не буду — обещать не могу. Знаю — буду!
Re[19]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 19:09
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Gaperton, Вы писали:


G>>Что-то тебя совсем понесло . Какие нафиг права?


PD>Которые ты защищаешь. Права обиженного мной samius.


Блин Вы оба ставите меня в неловкое положение. Я тут отсутствовал какое-то время, а из-за меня такой шум! Право, не стоило оно того.

Извиняюсь, что не отвечал. Не знал, что будет похоже что я обиделся.

Но вообще говоря, это больше похоже на повод для выяснения отношений между вами.
Re[20]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 19:32
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Тебе показалось. На самом деле, это обиженный ты упорно, из поста в пост, защищаешь свои права переходить на личности.


Дык это же профессиональное в случае Павла (оценивание чужих знаний). Права не дает, конечно, но я думаю, что можно сделать скидку преподавателю со стажем. Тем более, что Павел по обыкновению не имеет намерения обидеть, в отличии от некоторых завсегдатаев.

Я и сам грешу переходами на личности.
Re[21]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 21:58
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>1) Не люблю, когда вместо того, чтобы разговаривать по существу, переводят разговор на личности. Это признак слабости. В культурной благородной дискуссии — подобно удару по яйцам.


Тут полно ньюансов. В частности, культуры и благородства стало сильно меньше, когда ты начал в этой ветке учить Павла манерам.

G>Преподавателю простительно, говоришь? Вдвойне непростительно преподавателю, ибо имеет в основе неспособность объяснить, переходящую в желание задавить авторитетом. Говно преподаватель, если он к такому прибегает в общении со студентом.

Да, но это не про Павла. С говно-преподавателями я сталкивался на своем веку. И с говно-специалистами тоже. Сравнивать с ними Павла будет просто оскорблением для него.
Re[21]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 22:41
Оценка: :)
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Gaperton, Вы писали:


S>>>На самом деле я действительно согласился. Моя осведомленность в обсуждаемых материях представляет собой экстраполяцию домыслов. Можно считать что Павел проявил проницательность.


G>>То, что вы согласились — большой плюс Вам. Но не Павлу.


S>А почему вдруг на "Вы", если не секрет?


Уважительное обращение. Да и как-то стилистически неверно рядом с такой цитатой на "ты" обращаться.
Re[7]: Порядок вычисления аргументов
От: FR  
Дата: 13.10.10 18:47
Оценка: +1
Здравствуйте, samius, Вы писали:

S>Получили энергичный параметр шаблонного типа +/- сахар.


Без сахара можно и на C++ функторах сделать.
Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 08:33
Оценка:
Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.

Вопросы:
— Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости" списка аргументов вылет будет происходить не "в том месте".
— Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?
Re: >Я там был
От: Qbit86 Кипр
Дата: 11.10.10 08:38
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>



А теперь где?
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: >Я там был
От: Воронков Василий Россия  
Дата: 11.10.10 08:41
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>А теперь где?


Здесь
Re[2]: Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 08:53
Оценка:
Здравствуйте, Socrat, Вы писали:

S>В сях аргументы заталкиваются в стек, начиная с последнего. Вычисляются они тоже чаще всего соответственно.


Интересно, а это особенность реализации или стандарт? Студии у меня под рукой нет, я так понимаю, что — положим, в VC — вызов функции вида foo(x, y), где оба аргумента являются невычисляемыми (приводят к ошибке), вылетит на вычислении именно у?
Re[3]: Порядок вычисления аргументов
От: MasterZiv СССР  
Дата: 11.10.10 11:33
Оценка:
On 11.10.2010 12:53, Воронков Василий wrote:

> Интересно, а это особенность реализации или стандарт? Студии у меня под рукой


Особенности реализации. Стандарт порядок вычисления аргументов не определяет.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 11:36
Оценка:
Здравствуйте, DarkGray, Вы писали:

Это интересная проблема, побочные эффекты я, конечно, вообще упустил из вида
С другой стороны даже если __stdcall вычисляет параметры справа налево, то, видимо, указанное поведение не будет таким уж непривычным для программиста?
Re[3]: Порядок вычисления аргументов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.10.10 12:48
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, DarkGray, Вы писали:


ВВ>Это интересная проблема, побочные эффекты я, конечно, вообще упустил из вида

ВВ>С другой стороны даже если __stdcall вычисляет параметры справа налево, то, видимо, указанное поведение не будет таким уж непривычным для программиста?

В С++ неважно слева направо или наоборот, т.к. в общем случае неопределен порядок вычисления подвыражений. Поэтому, например, в таком коде:

typedef std::auto_ptr<T> ptr;
void foo(ptr a, ptr b);
//...
foo( ptr(new T), ptr(new T) );


присутствует потенциальная утечка.
Re[4]: Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 13:09
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>В С++ неважно слева направо или наоборот, т.к. в общем случае неопределен порядок вычисления подвыражений. Поэтому, например, в таком коде:

ЮЖ>
ЮЖ>typedef std::auto_ptr<T> ptr;
ЮЖ>void foo(ptr a, ptr b);
ЮЖ>//...
ЮЖ>foo( ptr(new T), ptr(new T) );

ЮЖ>присутствует потенциальная утечка.

Ну тут ссылку приводили на MS-specific. Хз, как там с этим. Если б помнил, не спрашивал.
По стандарту я так понял, нельзя вообще закладываться на то, что сайд эффекты будут происходить в определенном порядке — т.е. пример, приведенный DarkGray, с этой точки зрения просто адское зло.
Re[2]: Вот еще пример
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 13:28
Оценка:
Более современный — так сейчас происходит в 64-х битном Linux. Для функций с небольшим количеством аргументов ничего на стек не кладется, ни в каком порядке.

AMD64 ABI convention

The calling convention of the AMD64 application binary interface[8] is followed on Linux and other non-Microsoft operating systems. The registers RDI, RSI, RDX, RCX, R8 and R9 are used for integer and pointer arguments while XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 and XMM7 are used for floating point arguments. As in the Microsoft x64 calling convention, additional arguments are pushed onto the stack and the return value is stored in RAX.

Re[2]: Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 13:43
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Стандарты подавляющего большинства языков не определяют этот порядок.

G>То, в каком порядке это происходит — это относится не к языку, а к так называемому calling convention.
G>http://en.wikipedia.org/wiki/X86_calling_conventions

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

ВВ>>Вопросы:

ВВ>>- Есть ли какие-нибудь языки с подобными извращениями?
G>Конечно. Например, так происходит при "pascal calling convention".
G>Ты можешь указать тип convention в своей программе на C++ при определении функции, так что язык тут не причем.

Вопрос как-то все сводится к С++. Но как мне тут напомнили, С++ это плохой пример, т.к. собственно стандарт не гарантирует порядка сайд-эффектов, а в этом смысле программисту должно быть вообще пофиг, в каком там порядке вычисляются аргументы — хоть справа, хоть слева, хоть рандомно.

Вопрос можно поставить по-другому — есть ли энергичные языки, в которых порядок вычисления аргументов справа налево определен в стандарте — при том, что порядок вычисления остальных операций стандартный?
Re[3]: Порядок вычисления аргументов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.10.10 14:19
Оценка:
ВВ>С другой стороны даже если __stdcall вычисляет параметры справа налево, то, видимо, указанное поведение не будет таким уж непривычным для программиста?

вы здесь говорите про __stdcall, fastcall и т.д.
но порядок передачи аргументов в функцию не имеет никакого отношения к порядку вызова функций.
Re[4]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 14:57
Оценка:
Здравствуйте, DarkGray, Вы писали:

ВВ>>С другой стороны даже если __stdcall вычисляет параметры справа налево, то, видимо, указанное поведение не будет таким уж непривычным для программиста?


DG>вы здесь говорите про __stdcall, fastcall и т.д.

DG>но порядок передачи аргументов в функцию не имеет никакого отношения к порядку вызова функций.

На регистрово-ограниченных архитектурах имеет самое прямое отношение.
Re[2]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 11.10.10 15:14
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>И это не самый странный convention. Вот, например, fastcall, при котором возможна ситуация, когда стек вообще не задействуется. Более того, компилятор имеет полное право воткнуть fastcall автоматически, если решит, что так лучше.


Не имеет. Функцию он обязан компилировать в полном соответствии с ее спецификацией. Иначе при ее вызове в другом файле, где тело функции отсутствует, а есть только прототип, будет при вызове реализован такой код, который передаст управление в голубую даль.
Может, для static и имеет. Точнее, в принципе имеет.
With best regards
Pavel Dvorkin
Re[5]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 11.10.10 15:18
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>И стоит добавить третью причину. Если конвеншн определяет порядок вычисления — это сильно ограничивает современные оптимизаторы для компилируемых языков.


Хотел написать то же самое.

G>А вот во времена Win 3.11 было все четко. Как в конвеншне указано положение в стеке — в таком порядке и считается. Ибо регистров мало, и один хрен не более одной инструкции за такт.


Вообще-то регистров при переходе от Win16 к Win32 не прибавилось
With best regards
Pavel Dvorkin
Re[6]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 16:11
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>А вот во времена Win 3.11 было все четко. Как в конвеншне указано положение в стеке — в таком порядке и считается. Ибо регистров мало, и один хрен не более одной инструкции за такт.


PD>Вообще-то регистров при переходе от Win16 к Win32 не прибавилось


Ну, это как посмотреть.

Cовременный проц заглатывает х86 код большими кусками, прожевывает его, и выдает в исполнительный конвейер смесь более простых риск-инструкций, которые уже исполняются параллельно и неупорядочено — не нарушая семантики исходника. Внутри — фактически регистров больше, и применяется т.н. "переименование регистров". Иначе суперскаляр работать не cможет. Помимо этого, переупорядочивается также и запись в память. Но снаружи всего этого, конечно, не видно.

Подобный фокус в более чистом исполнении (аппаратное преобразование на лету кода стековой машины в трехадресный) применялся в Сан-овских Java-процессорах. Там как бы вообще у программиста регистров нет, но у нея внутре — они оченно даже есть. Хорошо описано у Танненбаума в его архитектуре ЭВМ. Кстати, рекомендую — ИМХО ничего лучше для программистов по архитектуре ЭВМ человечество не придумало.

А вот в х64 программисту уже доступно явным образом куда больше регистров.
Re[3]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 16:15
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Gaperton, Вы писали:


G>>И это не самый странный convention. Вот, например, fastcall, при котором возможна ситуация, когда стек вообще не задействуется. Более того, компилятор имеет полное право воткнуть fastcall автоматически, если решит, что так лучше.


PD>Не имеет. Функцию он обязан компилировать в полном соответствии с ее спецификацией. Иначе при ее вызове в другом файле, где тело функции отсутствует, а есть только прототип, будет при вызове реализован такой код, который передаст управление в голубую даль.


PD>Может, для static и имеет. Точнее, в принципе имеет.


Ну, если конвеншн явно не указан, то компилятор теоретически может его выбрать самостоятельно при компиляции модуля. Я слышал, он умеет это делать и практически. Точно не поручусь, но особо не вижу, что может ему помешать.
Re[7]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 11.10.10 16:21
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Вообще-то регистров при переходе от Win16 к Win32 не прибавилось


G>Ну, это как посмотреть.


<skipped>

Все это я хорошо знаю, но собственно РОНов не прибавилось. Как были ax, bx.., так и стали eax,ebx... 8 штук. Кстати, что касается исполнения, то , думаю, и 16-битные команды будут так же распараллеливаться на нынешних процессорах. Так что поставь на i7 Windows 3.11 — будет распараллеливание, будет

G>А вот в х64 программисту уже доступно явным образом куда больше регистров.


Немного больше . Вот на Итаниуме — да, куда больше.
With best regards
Pavel Dvorkin
Re[8]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 16:26
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Все это я хорошо знаю, но собственно РОНов не прибавилось. Как были ax, bx.., так и стали eax,ebx... 8 штук. Кстати, что касается исполнения, то , думаю, и 16-битные команды будут так же распараллеливаться на нынешних процессорах. Так что поставь на i7 Windows 3.11 — будет распараллеливание, будет


Само собой. Но надо заметить, что сейчас времена Win 7. А вот во времена Win 3.11...
Re[4]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 11.10.10 16:32
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Ну, если конвеншн явно не указан, то компилятор теоретически может его выбрать самостоятельно при компиляции модуля. Я слышал, он умеет это делать и практически. Точно не поручусь, но особо не вижу, что может ему помешать.


Если конвенция явно не указана, она ставится по умолчанию из настроек проекта

Project — Properties — Configuration Properties — C++ — Advanced — Calling Convention.

А помешать ему может вот что

a.cpp

void f(int x, int y) {...}

Должна ли f брать аргументы из регистров или нет ? Очищать стек внутри f или нет ?

b.cpp

void f(int x, int y);

main()
{
f(10,20);
}

Должны ли при вызове f аргументы заноситься в регистры или стек ? Очищать стек после вызова f или нет ?

Файлы, естественно, компилируются независимо.

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

Если еще экспорт/импорт сюда добавить, то будет совсем весело. Приходит как-то ко мне студент. Вызывает некую функцию из DLL, все в порядке, вызывается, а после вызова — unhandled exception. Для вызова он брал адрес (GetProcAddress), потом привел его к какому-то типу указателя на функцию и вызвал по этому указателю. Ну и вызвал, как _cdecl, а в DLL обычно _stdcall.
With best regards
Pavel Dvorkin
Re[5]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 16:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А помешать ему может вот что


Да, все правильно. Получается, что должен ставить дефолтовый.

Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли? Хотя я не знаю, насколько оно может быть осмысленным. Думать лень.
Re[6]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 11.10.10 16:43
Оценка:
Здравствуйте, Gaperton, Вы писали:


G>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли?


Нет, все равно нельзя.

А вот для static функций в принципе можно. Они тут описаны, они тут и вызываются. Но лучше все же не надо. Я потом при отладке рехнусь
With best regards
Pavel Dvorkin
Re: Порядок вычисления аргументов
От: batu Украина  
Дата: 11.10.10 16:55
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


ВВ>Вопросы:

ВВ>- Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости" списка аргументов вылет будет происходить не "в том месте".
ВВ>- Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?
Есть языки с так называемым "ленивым вычислением". Там аргументы вычисляются не при вызове функции, а при первом применении параметра. Т.е. их вычисление может вообще не понадобиться.
Re[7]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 11.10.10 17:00
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли?


PD>Нет, все равно нельзя.


Как все строго. Чуть что — так сразу — нельзя. Если очень хочется, то все-таки можно, правда ведь?

The next optimization that LTCG adds is custom calling conventions. Normally, all functions are either cdecl, stdcall, or fastcall. With custom calling conventions, the back end has enough knowledge that it can pass more values in registers, and less on the stack. This usually cuts code size and improves performance.


От-так от. :P :P :P
http://msdn.microsoft.com/en-us/magazine/cc301698.aspx
Re[7]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.10.10 17:40
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Gaperton, Вы писали:



G>>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли?


PD>Нет, все равно нельзя.


Ну а почему нет, хотя бы для функций которые и объявлены и вызываются в пределах одного cpp файла?

PD>А вот для static функций в принципе можно. Они тут описаны, они тут и вызываются. Но лучше все же не надо. Я потом при отладке рехнусь


а что если я класс с мембер функциями опишу в cpp, с ним нельзя будет мухлевать с соглашением? Хотя бы для невиртуальных методов?
Re[2]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.10.10 17:41
Оценка:
Здравствуйте, batu, Вы писали:

B>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


B>Есть языки с так называемым "ленивым вычислением". Там аргументы вычисляются не при вызове функции, а при первом применении параметра. Т.е. их вычисление может вообще не понадобиться.


Речь об энергичном языке.
Re[4]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.10.10 17:45
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>В С++ неважно слева направо или наоборот, т.к. в общем случае неопределен порядок вычисления подвыражений. Поэтому, например, в таком коде:


ЮЖ>
ЮЖ>typedef std::auto_ptr<T> ptr;
ЮЖ>void foo(ptr a, ptr b);
ЮЖ>//...
ЮЖ>foo( ptr(new T), ptr(new T) );


ЮЖ>присутствует потенциальная утечка.


А что здесь куда утечет?
Re: Порядок вычисления аргументов
От: мыщъх США http://nezumi-lab.org
Дата: 11.10.10 17:48
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


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


ВВ>Вопросы:

ВВ>- Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости"
BB> списка аргументов вылет будет происходить не "в том месте".
если аргументы имеют побочные эффекты, результат становится непредсказуемым. допустим, x и z модифицируют разделяемую ими переменную gx, а y ее читает.

ВВ> Есть ли какие-нибудь языки с подобными извращениями? Как по реализации,

BB> так и — что интересней — по стандарту. Может, это типичный прикол?
си/плюсы.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Порядок вычисления аргументов
От: Воронков Василий Россия  
Дата: 11.10.10 20:33
Оценка:
Здравствуйте, batu, Вы писали:

ВВ>>- Чем это может быть плохо/чревато, кроме того, что в случаях "невычисляемости" списка аргументов вылет будет происходить не "в том месте".

ВВ>>- Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?
B>Есть языки с так называемым "ленивым вычислением". Там аргументы вычисляются не при вызове функции, а при первом применении параметра. Т.е. их вычисление может вообще не понадобиться.

Ну я ж написал в самом начале, что речь про энергичные языки. В отношении ленивых сам этот вопрос не имеет смысла.
Re[5]: Порядок вычисления аргументов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.10.10 23:21
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ЮЖ>>В С++ неважно слева направо или наоборот, т.к. в общем случае неопределен порядок вычисления подвыражений. Поэтому, например, в таком коде:

ЮЖ>>
ЮЖ>>typedef std::auto_ptr<T> ptr;
ЮЖ>>void foo(ptr a, ptr b);
ЮЖ>>//...
ЮЖ>>foo( ptr(new T), ptr(new T) );

ЮЖ>>присутствует потенциальная утечка.

ВВ>Ну тут ссылку приводили на MS-specific. Хз, как там с этим.


Это не ms-specific, хотя результат, безусловно, зависит от компилятора. Точнее от того, какой способ вычисления он выберет. А вот при остуствии ограничений на порядок вычисления подвыражений таких способов существует несколько. Некоторые из них защищены от утечек, некоторые — нет
Автор: Юрий Жмеренецкий
Дата: 12.10.10
.
Re: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 11.10.10 23:58
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Предположим, что в энергичном языке при вызове foo(x, y, z) аргументы вычисляются не слева направо, а наоборот, т.е. сначала вычисляется z, потом y, потом x. При остальных вычислениях порядок стандартный.


ВВ>Вопросы:


ВВ>- Есть ли какие-нибудь языки с подобными извращениями? Как по реализации, так и — что интересней — по стандарту. Может, это типичный прикол?


Реализации caml light и ocaml. В спецификации сказано, что порядок неопределен. О возможных причинах такой реализации и спецификации можно почитать в докладе Xavier Leroy о языке ZINC, послужившем, видимо, прототипом caml light.
Re[8]: Таки можно
От: Pavel Dvorkin Россия  
Дата: 12.10.10 02:15
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Pavel Dvorkin, Вы писали:


G>>>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли?


PD>>Нет, все равно нельзя.


G>Как все строго. Чуть что — так сразу — нельзя. Если очень хочется, то все-таки можно, правда ведь?


G>

G> The next optimization that LTCG adds is custom calling conventions. Normally, all functions are either cdecl, stdcall, or fastcall. With custom calling conventions, the back end has enough knowledge that it can pass more values in registers, and less on the stack. This usually cuts code size and improves performance.


G>От-так от. :P :P :P

G>http://msdn.microsoft.com/en-us/magazine/cc301698.aspx

А вот так если ? Из той же ссылки

To use a custom calling convention for a function, the back end must see and generate all the calls to the function at the same time. This is the only way to ensure that the function is always called correctly. If there's even a chance that a function might be called from previously generated code, the compiler backs off and decides not to use a custom calling convention at all.

А теперь , пожалуйста, дай ответ — при каких условиях это может гарантироваться ?
With best regards
Pavel Dvorkin
Re[8]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 02:18
Оценка:
Здравствуйте, samius, Вы писали:


PD>>Нет, все равно нельзя.


S>Ну а почему нет, хотя бы для функций которые и объявлены и вызываются в пределах одного cpp файла?


Этого мало. Где гарантия, что завтра я ее не вызову из другого файла ? А первый файл уже откомпилирован ...

PD>>А вот для static функций в принципе можно. Они тут описаны, они тут и вызываются. Но лучше все же не надо. Я потом при отладке рехнусь


S>а что если я класс с мембер функциями опишу в cpp, с ним нельзя будет мухлевать с соглашением? Хотя бы для невиртуальных методов?


Я не вижу никакой разницы между мемберами и обычными функциями в этом плане. Равно как между виртуальными и невиртуальными — от виртуальности зависит выбор функции, а не передача ей параметров.
With best regards
Pavel Dvorkin
Re[6]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 03:55
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, samius, Вы писали:


ЮЖ>>>присутствует потенциальная утечка.


S>>А что здесь куда утечет?


ЮЖ>компилятор вправе сделать так (псевдокод):


ЮЖ>
ЮЖ>T* v1 = new T;
ЮЖ>T* v2 = new T; // 1

ЮЖ>ptr p1(v1);
ЮЖ>ptr p2(v2);

ЮЖ>foo(p1, p2);


ЮЖ>Если в точке 1 возникнет исключение (недостаточно памяти), то объект, на который указывает v1 не будет удален. Сalling convention здесь роли не играет.


Ага, здесь вообще вызов foo не играет.
Re[9]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 04:05
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:



PD>>>Нет, все равно нельзя.


S>>Ну а почему нет, хотя бы для функций которые и объявлены и вызываются в пределах одного cpp файла?


PD>Этого мало. Где гарантия, что завтра я ее не вызову из другого файла ? А первый файл уже откомпилирован ...

Разве можно вызывать функции, объявленные в cpp из другого файла?

PD>>>А вот для static функций в принципе можно. Они тут описаны, они тут и вызываются. Но лучше все же не надо. Я потом при отладке рехнусь


S>>а что если я класс с мембер функциями опишу в cpp, с ним нельзя будет мухлевать с соглашением? Хотя бы для невиртуальных методов?


PD>Я не вижу никакой разницы между мемберами и обычными функциями в этом плане.

я думал о инстанс методах, но написал о мемберах. Инстанс методы чем-то отличаются в этом плане, что для static функций в принципе можно, а для инстанс — нет?

PD>Равно как между виртуальными и невиртуальными — от виртуальности зависит выбор функции, а не передача ей параметров.

Здесь как раз все просто. Если класс, объявленный в cpp, реализует виртуальный метод другого класса, объявленного в каком-либо заголовке, то этот метод может быть вызван из других файлов, которые могут компилироваться позже и другим компилятором.
Re[10]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 04:32
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Этого мало. Где гарантия, что завтра я ее не вызову из другого файла ? А первый файл уже откомпилирован ...

S>Разве можно вызывать функции, объявленные в cpp из другого файла?

Не понял. Тело их в другом файле, а прототип, конечно, доступен.

S>я думал о инстанс методах, но написал о мемберах. Инстанс методы чем-то отличаются в этом плане, что для static функций в принципе можно, а для инстанс — нет?


Ты путаешь static члены класса и static в С. Это совсем разные вещи. Я говорил о втором, первое в этом плане неинтересно.

PD>>Равно как между виртуальными и невиртуальными — от виртуальности зависит выбор функции, а не передача ей параметров.

S>Здесь как раз все просто. Если класс, объявленный в cpp, реализует виртуальный метод другого класса, объявленного в каком-либо заголовке, то этот метод может быть вызван из других файлов, которые могут компилироваться позже и другим компилятором.

Если в некотором файле есть некоторая функция, хоть классово-виртуальная, хоть классово-невиртуальная, хоть бесклассовая, но только не static в смысле чистого С, то эту функцию можно вызывать из других файлов при условии, что компилятор один и тот же. Это, собственно говоря, банальность, на этом весь проект и построен. Что же касается вызова из файлов, откомпилированных другим компилятором, то это скорее всего не пройдет хотя бы из-за разного name decoration, а также из-за того, что некоторые calling conventions в разных компиляторах реализуются по-разному. В конкретном случае может пройти.
With best regards
Pavel Dvorkin
Re[11]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 04:48
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>>>Этого мало. Где гарантия, что завтра я ее не вызову из другого файла ? А первый файл уже откомпилирован ...

S>>Разве можно вызывать функции, объявленные в cpp из другого файла?

PD>Не понял. Тело их в другом файле, а прототип, конечно, доступен.

Какой прототип? Вот смотри:
// xxx.cpp

void foo(int a, CFoo *p)
{
   // do something
}

В заголовках этого метода нет. Как его вызвать из других файлов? И почему бы собственно компилятору не смухлевать с соглашением?

S>>я думал о инстанс методах, но написал о мемберах. Инстанс методы чем-то отличаются в этом плане, что для static функций в принципе можно, а для инстанс — нет?


PD>Ты путаешь static члены класса и static в С. Это совсем разные вещи. Я говорил о втором, первое в этом плане неинтересно.

Ты говоришь о static ограничении видимости?
Ну а почему первое не интересно, если класс объявлен в cpp?

PD>>>Равно как между виртуальными и невиртуальными — от виртуальности зависит выбор функции, а не передача ей параметров.

S>>Здесь как раз все просто. Если класс, объявленный в cpp, реализует виртуальный метод другого класса, объявленного в каком-либо заголовке, то этот метод может быть вызван из других файлов, которые могут компилироваться позже и другим компилятором.

PD>Если в некотором файле есть некоторая функция, хоть классово-виртуальная, хоть классово-невиртуальная, хоть бесклассовая, но только не static в смысле чистого С, то эту функцию можно вызывать из других файлов при условии, что компилятор один и тот же. Это, собственно говоря, банальность, на этом весь проект и построен.


Пример выше. Покажи как вызвать эту функцию из других файлов. Или речь о том чтобы объявить прототип в надежде что линковщик подхватит реализацию?

PD>Что же касается вызова из файлов, откомпилированных другим компилятором, то это скорее всего не пройдет хотя бы из-за разного name decoration, а также из-за того, что некоторые calling conventions в разных компиляторах реализуются по-разному. В конкретном случае может пройти.

Ну это не очень интересно. Останемся в рамках одного компилятора.
Re[7]: Порядок вычисления аргументов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 12.10.10 04:49
Оценка:
Здравствуйте, samius, Вы писали:

S>Ага, здесь вообще вызов foo не играет.


Да, в том смысле что два этих ('ptr(new T)') подвыражения могут являются частью любого другого (под)выражения, и это не обязательно вызов функции. Тоже самое можно сказать про пример
Автор: DarkGray
Дата: 11.10.10
, который привел DarkGray.
Re[8]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 04:54
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, samius, Вы писали:


S>>Ага, здесь вообще вызов foo не играет.


ЮЖ>Да, в том смысле что два этих ('ptr(new T)') подвыражения могут являются частью любого другого (под)выражения, и это не обязательно вызов функции.

Они даже могут не являться частью другого подвыражения и объявлены для получения side effect-ов от new/delete T
Re[12]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 05:11
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Не понял. Тело их в другом файле, а прототип, конечно, доступен.

S>Какой прототип? Вот смотри:
S>
S>// xxx.cpp

S>void foo(int a, CFoo *p)
S>{
S>   // do something
S>}
S>

S>В заголовках этого метода нет. Как его вызвать из других файлов? И почему бы собственно компилятору не смухлевать с соглашением?

Если в заголовках нет (а там именно прототипы) — то в С++ нельзя (в С можно). Но это ничего не меняет.

Сегодня.

a.cpp. В нем функция foo
b.cpp. В нем о foo ничего не слышали.

Компилируем a и b. Код foo реализован исходя из умных соображений, не так, как сказано.

Завтра

В b.cpp добавляем прототип foo (или заголовок с этми прототипом, как хочешь).
a.cpp не меняем, поэтому он перекомпилирован не будет. При линковке будет взят вчерашний a.obj.

Откуда теперь при компиляции вызова b компилятору знать, что этот вызов надо сделать не через __stdcall, а как-то иначе ?


S>>>я думал о инстанс методах, но написал о мемберах. Инстанс методы чем-то отличаются в этом плане, что для static функций в принципе можно, а для инстанс — нет?


PD>>Ты путаешь static члены класса и static в С. Это совсем разные вещи. Я говорил о втором, первое в этом плане неинтересно.

S>Ты говоришь о static ограничении видимости?

Именно. Вот в этом случае все вызовы компилятору известны, функцию действительно нельзя вызвать из другого файла.

S>Ну а почему первое не интересно, если класс объявлен в cpp?


Да какая разница, где он объявлен ? Хочешь — в h-файле с реализацией в cpp (общепринято). Хочешь — полностью в h (тоже вполне принято). Хочешь — полностью в cpp (дурной тон, но не ошибка). Какое это значение имеет ? Компилируется-то cpp, h просто туда вставляется.

S>Пример выше. Покажи как вызвать эту функцию из других файлов. Или речь о том чтобы объявить прототип в надежде что линковщик подхватит реализацию?


Здорово ты в С++ плаваешь . Не обижайся, но это так.
Прототип нужен компилятору, чтобы сформировать правильный вызов, а также, чтобы проверить соотвествие типов и количества фактических параметров и формальных. Линкер доступа к исходникам не имеет. Можно слинковать программу, имея только obj-файлы (ну и потребные lib, конечно)
With best regards
Pavel Dvorkin
Re[13]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 05:31
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>Сегодня.


PD>a.cpp. В нем функция foo

PD>b.cpp. В нем о foo ничего не слышали.

PD>Компилируем a и b. Код foo реализован исходя из умных соображений, не так, как сказано.


PD>Завтра


PD>В b.cpp добавляем прототип foo (или заголовок с этми прототипом, как хочешь).

PD>a.cpp не меняем, поэтому он перекомпилирован не будет. При линковке будет взят вчерашний a.obj.

PD>Откуда теперь при компиляции вызова b компилятору знать, что этот вызов надо сделать не через __stdcall, а как-то иначе ?


Ну он же вчера из каких-то соображений скомпилировал a.cpp. А сегодя из тех же соображений узнает о соглашении foo, если оно явно не указано в прототипе.

S>>Ты говоришь о static ограничении видимости?


PD>Именно. Вот в этом случае все вызовы компилятору известны, функцию действительно нельзя вызвать из другого файла.

Тогда понятно (после того как освежил память о static модификаторе видимости).

S>>Ну а почему первое не интересно, если класс объявлен в cpp?


PD>Да какая разница, где он объявлен ? Хочешь — в h-файле с реализацией в cpp (общепринято). Хочешь — полностью в h (тоже вполне принято). Хочешь — полностью в cpp (дурной тон, но не ошибка). Какое это значение имеет ? Компилируется-то cpp, h просто туда вставляется.


Если класс объявлен в cpp, то это значит что он не объявлен в h. Я бы во всяком случае не стал объявлять класс более чем в одном месте . Хотя это ничего не должно значить для компилятора.

А по поводу дурного тона... Что если класс не предназначен для того чтобы инклудить его кому-либо? Что если он нужен только для реализации некоторого метода? Мне кажется что наоборот, вытаскивать его в хидер будет неверно.

S>>Пример выше. Покажи как вызвать эту функцию из других файлов. Или речь о том чтобы объявить прототип в надежде что линковщик подхватит реализацию?


PD>Здорово ты в С++ плаваешь . Не обижайся, но это так.


Да я не обижаюсь. Я C++ не видел 8 лет. Собственно и до этого в процессе компиляции не разбирался.

PD>Прототип нужен компилятору, чтобы сформировать правильный вызов, а также, чтобы проверить соотвествие типов и количества фактических параметров и формальных. Линкер доступа к исходникам не имеет. Можно слинковать программу, имея только obj-файлы (ну и потребные lib, конечно)
Re[14]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 05:46
Оценка:
Здравствуйте, samius, Вы писали:

S>Ну он же вчера из каких-то соображений скомпилировал a.cpp. А сегодя из тех же соображений узнает о соглашении foo, если оно явно не указано в прототипе.


Если явно не указано в прототипе — берется из опций проекта.
Но в принципе возможно, если это отменить (а это не С++, это лишь опция). То есть если соглашение не указано — оно на выбор компилятора.
Проблемы будут с унаследованным кодом.

S>>>Ну а почему первое не интересно, если класс объявлен в cpp?


PD>>Да какая разница, где он объявлен ? Хочешь — в h-файле с реализацией в cpp (общепринято). Хочешь — полностью в h (тоже вполне принято). Хочешь — полностью в cpp (дурной тон, но не ошибка). Какое это значение имеет ? Компилируется-то cpp, h просто туда вставляется.


S>Если класс объявлен в cpp, то это значит что он не объявлен в h. Я бы во всяком случае не стал объявлять класс более чем в одном месте . Хотя это ничего не должно значить для компилятора.


Класс можно объявить (декларация) много раз. Поэтому его в h и помещают — чтобы он вставился и в a.cpp, где его используют, и в b.cpp, где его тоже используют, и в c.cpp, где он реализован. cpp и h — это лишь форма разделения кода на файлы. h-файл просто вставляется в cpp до компиляции. В принципе можно вообще h-файлы удалить, будет очень неизящно, но возможно.

S>А по поводу дурного тона... Что если класс не предназначен для того чтобы инклудить его кому-либо? Что если он нужен только для реализации некоторого метода? Мне кажется что наоборот, вытаскивать его в хидер будет неверно.


Общепринято его все же в хедер. Не нужен он в других файлах — ну и не надо. Сегодня не нужен, завтра вдруг понадобится, что же, теперь все переписывать ? Я уж не говорю о template классах, там вообще иначе, как в хедерах, практически нельзя.
With best regards
Pavel Dvorkin
Re[15]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 06:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


S>>Ну он же вчера из каких-то соображений скомпилировал a.cpp. А сегодя из тех же соображений узнает о соглашении foo, если оно явно не указано в прототипе.


PD>Если явно не указано в прототипе — берется из опций проекта.

PD>Но в принципе возможно, если это отменить (а это не С++, это лишь опция). То есть если соглашение не указано — оно на выбор компилятора.
PD>Проблемы будут с унаследованным кодом.

Все же речь идет о LTCG, нет?

S>>А по поводу дурного тона... Что если класс не предназначен для того чтобы инклудить его кому-либо? Что если он нужен только для реализации некоторого метода? Мне кажется что наоборот, вытаскивать его в хидер будет неверно.


PD>Общепринято его все же в хедер. Не нужен он в других файлах — ну и не надо. Сегодня не нужен, завтра вдруг понадобится, что же, теперь все переписывать ?

Понадобится — можно и переписать. Только зачем же все?

PD>Я уж не говорю о template классах, там вообще иначе, как в хедерах, практически нельзя.

Наоборот, практически можно и в cpp, если template сегодня больше никому не нужен. И смысла его тащить в хидер (авось кому-нибудь завтра понадобится) я не вижу.
Re[7]: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 12.10.10 06:07
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Gaperton, Вы писали:



G>>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли?


PD>Нет, все равно нельзя.


Почему нельзя? Если соглашение о вызове будет однозначно определяться сигнатурой, какие могут проблемы?
Re[16]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 08:38
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Если явно не указано в прототипе — берется из опций проекта.

PD>>Но в принципе возможно, если это отменить (а это не С++, это лишь опция). То есть если соглашение не указано — оно на выбор компилятора.
PD>>Проблемы будут с унаследованным кодом.

S>Все же речь идет о LTCG, нет?


Да, но в библиотеке .lib от прежней студии могли строго соблюдаться конвенции. А вызов вдруг пойдет иначе...

PD>>Общепринято его все же в хедер. Не нужен он в других файлах — ну и не надо. Сегодня не нужен, завтра вдруг понадобится, что же, теперь все переписывать ?

S>Понадобится — можно и переписать. Только зачем же все?

А зачем ? Проще же не переписывать. Есть канон, он обоснован и многократно опробован, какой смысл в его нарушении ? Если есть смысл — можно и нарушить, я всегда не против нарушить каноны , но должен же быть смысл.

PD>>Я уж не говорю о template классах, там вообще иначе, как в хедерах, практически нельзя.

S>Наоборот, практически можно и в cpp, если template сегодня больше никому не нужен. И смысла его тащить в хидер (авось кому-нибудь завтра понадобится) я не вижу.

Сегодня не нужен — завтра нужен будет. И инстанциироваться он завтра будет от другого аргумента — сегодня от int, а завтра от float. И придется все рефакторить. А мы не в шарпе, здесь рефакторингом заниматься не очень любят, особенно без всякой надобности
With best regards
Pavel Dvorkin
Re[8]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 08:40
Оценка:
Здравствуйте, k.o., Вы писали:

PD>>Нет, все равно нельзя.


KO>Почему нельзя? Если соглашение о вызове будет однозначно определяться сигнатурой, какие могут проблемы?


Будет время — поисследую, как там в VC 2010. Все же, если не указана явно calling convention, положено брать из опций проекта. Проблемы могут быть с унаследованным кодом, с экспортом/импортом...
With best regards
Pavel Dvorkin
Re[17]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 08:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


S>>Все же речь идет о LTCG, нет?


PD>Да, но в библиотеке .lib от прежней студии могли строго соблюдаться конвенции. А вызов вдруг пойдет иначе...

а в .lib не подписано, чем она компилилась?

PD>>>Общепринято его все же в хедер. Не нужен он в других файлах — ну и не надо. Сегодня не нужен, завтра вдруг понадобится, что же, теперь все переписывать ?

S>>Понадобится — можно и переписать. Только зачем же все?

PD>А зачем ? Проще же не переписывать. Есть канон, он обоснован и многократно опробован, какой смысл в его нарушении ? Если есть смысл — можно и нарушить, я всегда не против нарушить каноны , но должен же быть смысл.


Смысл в том, что не люблю много файлов. В C# стараюсь делать по файлу на класс. В плюсах получается 2 файла на класс. Вот я на это правило и забиваю. Сильно забиваю. В хидеры пишу только то что нужно в других файлах.

PD>>>Я уж не говорю о template классах, там вообще иначе, как в хедерах, практически нельзя.

S>>Наоборот, практически можно и в cpp, если template сегодня больше никому не нужен. И смысла его тащить в хидер (авось кому-нибудь завтра понадобится) я не вижу.

PD>Сегодня не нужен — завтра нужен будет. И инстанциироваться он завтра будет от другого аргумента — сегодня от int, а завтра от float. И придется все рефакторить. А мы не в шарпе, здесь рефакторингом заниматься не очень любят, особенно без всякой надобности

Я предпочитаю решать сегодняшние проблемы. А сегодня у меня проблема с обилием файлов, среди которых мне сложно навигацией заниматься. Завтра эта проблема будет еще острее. Но когда мне понадобится реюз шаблона — вытащить его в хидер дело минуты.

пс. Ушли в оффтоп.
Re[18]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 09:12
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Да, но в библиотеке .lib от прежней студии могли строго соблюдаться конвенции. А вызов вдруг пойдет иначе...

S>а в .lib не подписано, чем она компилилась?

Может, и да. Там COFF формат, я сейчас не помню точно, но вроде как там есть PE-заголовок, а если есть, то есть и версия линкера. Но голову на отсечение не дам. А впрочем, что мне с того ? Я же хочу эту lib использовать, хоть она и от прежней версии.
Тут вообще проблем может быть много. Скажем, беру я либу от mysql, откомилированной версией 2008, ставлю в проект мой на 2010 — на тебе проблему. Ждите, пока они не сделают версию для 2010.
А еще есть DLL. А их можно использовать по принципу двоичного стандарта. Например, вызвать эту функцию из Delphi, VB или твоего любимого C# Надеюсь, что с экспортом они таких шуток себе не позволили.

S>Смысл в том, что не люблю много файлов. В C# стараюсь делать по файлу на класс. В плюсах получается 2 файла на класс. Вот я на это правило и забиваю. Сильно забиваю. В хидеры пишу только то что нужно в других файлах.


Искренне говорю — зря. Ни к каким проблемам это удвоение файлов не приводит, а проблемы при твоем подходе будут раньше или позже.


PD>>Сегодня не нужен — завтра нужен будет. И инстанциироваться он завтра будет от другого аргумента — сегодня от int, а завтра от float. И придется все рефакторить. А мы не в шарпе, здесь рефакторингом заниматься не очень любят, особенно без всякой надобности

S>Я предпочитаю решать сегодняшние проблемы. А сегодня у меня проблема с обилием файлов, среди которых мне сложно навигацией заниматься. Завтра эта проблема будет еще острее. Но когда мне понадобится реюз шаблона — вытащить его в хидер дело минуты.

Да бога ради. Никаких явных нарушений здесь нет, ничего такого, что могло бы сделать программу неработающей. Хочешь делать так — делай.

S>пс. Ушли в оффтоп.


With best regards
Pavel Dvorkin
Re[9]: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 12.10.10 09:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, k.o., Вы писали:


PD>>>Нет, все равно нельзя.


KO>>Почему нельзя? Если соглашение о вызове будет однозначно определяться сигнатурой, какие могут проблемы?


PD>Будет время — поисследую, как там в VC 2010. Все же, если не указана явно calling convention, положено брать из опций проекта. Проблемы могут быть с унаследованным кодом, с экспортом/импортом...


Так, речь шла про то что компилятор гипотетически может сам выбирать calling convention. Вполне, возможно, что в MSVC этого нет.

А какие проблемы "с унаследованным кодом, с экспортом/импортом"? Я, полагаю, это не имеет отношения к возможным изменениям С++ ABI, стабильности которого нельзя ожидать даже при использовании дугих опций компилятора?
Re[17]: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 12.10.10 09:53
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>>>Если явно не указано в прототипе — берется из опций проекта.

PD>>>Но в принципе возможно, если это отменить (а это не С++, это лишь опция). То есть если соглашение не указано — оно на выбор компилятора.
PD>>>Проблемы будут с унаследованным кодом.

S>>Все же речь идет о LTCG, нет?


PD>Да, но в библиотеке .lib от прежней студии могли строго соблюдаться конвенции. А вызов вдруг пойдет иначе...а


Если версия компилятора поменялась, то и библиотеки надо пересобирать. Совместимость между разными компиляторами можно получить только для исходного кода или динамических библиотек с С или COM интерфейсами с заданными соглашениями о вызове.

PD>>>Общепринято его все же в хедер. Не нужен он в других файлах — ну и не надо. Сегодня не нужен, завтра вдруг понадобится, что же, теперь все переписывать ?

S>>Понадобится — можно и переписать. Только зачем же все?

PD>А зачем ? Проще же не переписывать. Есть канон, он обоснован и многократно опробован, какой смысл в его нарушении ? Если есть смысл — можно и нарушить, я всегда не против нарушить каноны , но должен же быть смысл.


Первый раз о таком каноне слышу, на первый взгляд, это аналогично (очевидно абсурдному) запрету на использование закрытых членов класса: вдруг они кому-нибудь еще понадобятся?

PD>>>Я уж не говорю о template классах, там вообще иначе, как в хедерах, практически нельзя.


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

PD>Сегодня не нужен — завтра нужен будет. И инстанциироваться он завтра будет от другого аргумента — сегодня от int, а завтра от float. И придется все рефакторить. А мы не в шарпе, здесь рефакторингом заниматься не очень любят, особенно без всякой надобности


В любом случае придется либо рефакторить либо заранее продумывать все варианты использования этой сущности. Отложив это на потом нам не нужно будет тратить дополнительное время на, возможно, никому ненужный код, плюс, впоследствии у нас будет больше информации для создания более подходящего дизайна.
Re[18]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 10:05
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Если версия компилятора поменялась, то и библиотеки надо пересобирать.


Не обязательно.


KO>Первый раз о таком каноне слышу, на первый взгляд, это аналогично (очевидно абсурдному) запрету на использование закрытых членов класса: вдруг они кому-нибудь еще понадобятся?


Я не хочу на эту тему флейм устраивать. Не нравится — делай как тебе нравится, я никому не предписываю.
With best regards
Pavel Dvorkin
Re[9]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 10:35
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А теперь , пожалуйста, дай ответ — при каких условиях это может гарантироваться ?


Технология называется "link-time code generation", и является глобальной оптимизацией.

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

Урок всем нам, дружище. Невозможность доказать очень сложно, гораздо сложнее, чем возможность. Надо быть с этим аккуратнее.
Re[13]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 10:45
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Прототип нужен компилятору, чтобы сформировать правильный вызов, а также, чтобы проверить соотвествие типов и количества фактических параметров и формальных. Линкер доступа к исходникам не имеет. Можно слинковать программу, имея только obj-файлы (ну и потребные lib, конечно)


Я же тебе показал ссылку. Современный линкер доступа к исходникам, конечно, не имеет, но кодогенерацию производить во время сборки — умеет. И мухлевать при этом с calling convention, что черным по белому написано.

PD>Здорово ты в С++ плаваешь . Не обижайся, но это так.


Отстал ты от жизни, и в технологиях здорово компиляции плаваешь. Не обижайся, что на правду обижаться-то.

ЗЫ: Переводя разговор на личности, как в цитате выше, ты в случае своей неправоты (а знать всего в принципе невозможно) сам выставляешь себя дураком. И ведь никто за язык не тянет.

ЗЗЫ: И давай пиписьками меряться не будем. Не студенты, все-таки. Тем более, что знания в эпоху интернета почти ничего не стоят — они слишком легко доступны для того, чтобы ими гордится.
Re[19]: Порядок вычисления аргументов
От: k.o. Россия  
Дата: 12.10.10 10:55
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, k.o., Вы писали:


KO>>Если версия компилятора поменялась, то и библиотеки надо пересобирать.


PD>Не обязательно.


Если речь о С++ библиотеках, то проблемы вознкали даже после установки Service Pack. Возможно, если ограничиться С с классами и не использовать стандартную библиотеку (кроме того, что было в С), оно и будет работать, но это, ИМХО, не интересные частные случаи.

KO>>Первый раз о таком каноне слышу, на первый взгляд, это аналогично (очевидно абсурдному) запрету на использование закрытых членов класса: вдруг они кому-нибудь еще понадобятся?


PD>Я не хочу на эту тему флейм устраивать. Не нравится — делай как тебе нравится, я никому не предписываю.


Мне, на самом деле, интересно почему стоит поступать согласно упомянутым "канонам". Единственная упомянутая причина показалась мне неубедительной и я, всего-лишь, попытался объяснить почему. Прошу прощения, если это выглядит как начало флейма.
Re[10]: Таки можно
От: Pavel Dvorkin Россия  
Дата: 12.10.10 12:15
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Технология называется "link-time code generation", и является глобальной оптимизацией.


Я о ней знаю.

G>Очевидно, со своими соображениями ты ошибся, пропустив случай глобальных оптимизаций как класс, думая, что все происходит только локально для модуля и раздельно.


Да, вполне возможно. Тем не менее , если будет время, я поэкспериментирую.

G>Урок всем нам, дружище. Невозможность доказать очень сложно, гораздо сложнее, чем возможность. Надо быть с этим аккуратнее.




Все же нажеюсь, что для экспортируемых функций такое не делается
With best regards
Pavel Dvorkin
Re[11]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 12:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Технология называется "link-time code generation", и является глобальной оптимизацией.


PD>Я о ней знаю.


Одно можно сказать с уверенность — сейчас уж точно знаешь. А знал или не знал раньше — никакого значения не имеет. Ибо это ничего не меняет.

PD>Все же нажеюсь, что для экспортируемых функций такое не делается


Само собой. Очевидно, это делается для внутренних функций единицы линковки.
Re[14]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 12:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Я же тебе показал ссылку. Современный линкер доступа к исходникам, конечно, не имеет, но кодогенерацию производить во время сборки — умеет. И мухлевать при этом с calling convention, что черным по белому написано.


PD>>Здорово ты в С++ плаваешь . Не обижайся, но это так.


G>Отстал ты от жизни, и в технологиях здорово компиляции плаваешь. Не обижайся, что на правду обижаться-то.


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

http://rsdn.ru/forum/philosophy/3013344.1.aspx
Автор: Pavel Dvorkin
Дата: 07.07.08


G>ЗЫ: Переводя разговор на личности, как в цитате выше, ты в случае своей неправоты (а знать всего в принципе невозможно) сам выставляешь себя дураком. И ведь никто за язык не тянет.


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

G>ЗЗЫ: И давай пиписьками меряться не будем. Не студенты, все-таки. Тем более, что знания в эпоху интернета почти ничего не стоят — они слишком легко доступны для того, чтобы ими гордится.


No comments.
With best regards
Pavel Dvorkin
Re[20]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 12:26
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Мне, на самом деле, интересно почему стоит поступать согласно упомянутым "канонам". Единственная упомянутая причина показалась мне неубедительной и я, всего-лишь, попытался объяснить почему. Прошу прощения, если это выглядит как начало флейма.


Я же уже сказал : не хочешь — не надо. Что мне еще добавить ?
With best regards
Pavel Dvorkin
Re[12]: Таки можно
От: Pavel Dvorkin Россия  
Дата: 12.10.10 12:36
Оценка:
Здравствуйте, Gaperton, Вы писали:

PD>>Я о ней знаю.


G>Одно можно сказать с уверенность — сейчас уж точно знаешь. А знал или не знал раньше — никакого значения не имеет. Ибо это ничего не меняет.


Ну тогда твоя позиция безупречна . Сейчас знаешь — благодаря твоему указанию. А знал ли раньше — значения не имеет. Что тут можно сказать ? Впрочем, ссылку насчет моего знания раньше я тебе уже послал.

И тем не менее, в каких случаях она выполняется, а в каких нет — это еще вопрос. Не случайно там сказано, что компилятор должен иметь доступ ко всем вызовам. Может, при этом имеется в виду и вторая фаза, но тем не менее.

G>Само собой. Очевидно, это делается для внутренних функций единицы линковки.


Гм. А что такое внутренние функции ? Любые неэкспортируемые ?
With best regards
Pavel Dvorkin
Re[15]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 12:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Отстал ты от жизни, и в технологиях здорово компиляции плаваешь. Не обижайся, что на правду обижаться-то.


PD>Тоже не обижаюсь, уже давно на твои инвективы в мой адрес. Но я бы не стал делать далеко идущие выводы насчет того, что я тут знаю, а что нет. Посмотри хотя бы вот сюда


Рассказывать мне о том, чего бы ты не стал делать, сразу после того, как ты это сделал — довольно комично. Посмотри хотя бы вот сюда

PD>>>Здорово ты в С++ плаваешь . Не обижайся, но это так.


Все что я сделал — написал тебе полную кальку с этого захода.

G>>ЗЫ: Переводя разговор на личности, как в цитате выше, ты в случае своей неправоты (а знать всего в принципе невозможно) сам выставляешь себя дураком. И ведь никто за язык не тянет.


PD>Я всего лишь указал samius на определенные его непонимания, с чем он и сам согласился. И меньше всего это представляет собой переход на личности.


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

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


Твоя фраза является переходом на личности независимо от того, была чья-то личность этим задета, или нет.

И так как ты не в личном письме это написал, а позволил себе высказаться на публике — нечего изумляться, какое публике до этого дело.

G>>ЗЗЫ: И давай пиписьками меряться не будем. Не студенты, все-таки. Тем более, что знания в эпоху интернета почти ничего не стоят — они слишком легко доступны для того, чтобы ими гордится.


PD>No comments.


Ну вот и славно. Хотя эти твои "я это знаю" — "ты этого не знаешь" — "как ты можешь говорить, что я чего-то не знаю?!" так забавны .
Re[16]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 12:45
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Ну вот и славно. Хотя эти твои "я это знаю" — "ты этого не знаешь" — "как ты можешь говорить, что я чего-то не знаю?!" так забавны .


Читаешь это — и прям "школьные годы чудесные" сразу вспоминаются.

Хотя это что. Священники, говорят, меряются не этим, а тем, кто более святой .
Re[16]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 12:58
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Pavel Dvorkin, Вы писали:


G>>>Отстал ты от жизни, и в технологиях здорово компиляции плаваешь. Не обижайся, что на правду обижаться-то.


PD>>Тоже не обижаюсь, уже давно на твои инвективы в мой адрес. Но я бы не стал делать далеко идущие выводы насчет того, что я тут знаю, а что нет. Посмотри хотя бы вот сюда


G>Рассказывать мне о том, чего бы ты не стал делать, сразу после того, как ты это сделал — довольно комично. Посмотри хотя бы вот сюда


Ну комично тебе так комично. Дело твое, мне это мало интересно. Если я (допустим) забыл об этом и вызвал тем самым твой смех — все, что могу сказать, что у тебя своеобразное чувство юмора.

G>Обсуждение предполагаемых тобой личных качеств, знаний, и прочих свойств собеседника, равно как и выдача оценок этим качествам, является переводом темы обсуждения на личности.


В любом случае, так это или нет, но это касается именно той личности, о которой идет речь. А он ответил вот что

PD>Здорово ты в С++ плаваешь . Не обижайся, но это так.


S>Да я не обижаюсь. Я C++ не видел 8 лет. Собственно и до этого в процессе компиляции не разбирался.


Так что твоя защита тех, кто об этом никак не просил, выглядит несколько странно. Уж если я перешел на личности — он и должен был бы обидеться, если это так. Он не обиделся, зато обиделся ты и начал мне выговаривать.

G>Твоя фраза является переходом на личности независимо от того, была чья-то личность этим задета, или нет.


Вообще-то несколько странно защищать права личности, если личность вовсе не заявляет, что эти права задеты.

G>И так как ты не в личном письме это написал, а позволил себе высказаться на публике — нечего изумляться, какое публике до этого дело.


Ну-ну. Ты себе роль некоего арбитра почему-то присвоил. Давай тогда уж так — если тот, с кем я разговариваю, на меня обидится, тогда я и буду извиняться. А так мало ли что кому не нравится.

G>>>ЗЗЫ: И давай пиписьками меряться не будем. Не студенты, все-таки. Тем более, что знания в эпоху интернета почти ничего не стоят — они слишком легко доступны для того, чтобы ими гордится.


PD>>No comments.


G>Ну вот и славно. Хотя эти твои "я это знаю" — "ты этого не знаешь" — "как ты можешь говорить, что я чего-то не знаю?!" так забавны .


А ссылочку можно, где я именно так сказал "как ты можешь говорить, что я чего-то не знаю" ? Мне как-то странно — не мог я такое сказать. Ссылочку , пожалуйста. Поиск дает только одно место — твое письмо, на которое я сейчас отвечаю.

Твои высказывания вряд ли можно назвать забавными, а попытки переврать мои слова или приписать мне то, чего я не говорил, вызывают, как говорят дипломаты, "смешанное чувство". Говорю именно так, чтобы у тебя не было повода обижаться.
With best regards
Pavel Dvorkin
Re[13]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 13:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Одно можно сказать с уверенность — сейчас уж точно знаешь. А знал или не знал раньше — никакого значения не имеет. Ибо это ничего не меняет.


PD>Ну тогда твоя позиция безупречна . Сейчас знаешь — благодаря твоему указанию. А знал ли раньше — значения не имеет. Что тут можно сказать ? Впрочем, ссылку насчет моего знания раньше я тебе уже послал.


Зачем тут вообще что-то говорить?

Если ты не смог своими знаниями воспользоваться в обсуждении — то кому какая разница, были они у тебя до него, или нет? Я не вижу ни малейшего повода это выяснять. Мне не интересен ни факт их наличия у тебя на момент того, как я привел тебе ссылку, ни источник их получения. Веришь, нет?

Чтобы облегчить твое состояние — я нашел ссылку про LTCG за минуту до того, как писал пост. Специально для тебя постарался. До этого момента я точно не знал, если ли вообще у MS такая технология, и как она называется. И совершенно по этому поводу не переживаю. Ибо я знаю уже настолько дохрена разных штук из самых разных областей (многие из которых не особо-то и нужны) — что могу уже себе с чистой совестью позволить не захламлять свой мозг всякой ерундой "на всякий случай".

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

PD>И тем не менее, в каких случаях она выполняется, а в каких нет — это еще вопрос. Не случайно там сказано, что компилятор должен иметь доступ ко всем вызовам. Может, при этом имеется в виду и вторая фаза, но тем не менее.


Там, строго говоря, этим линкер занимается, а не компилятор. И, когда он собирает exe, он, очевидно, имеет доступ ко всем вызовам. Кроме динамических либ, естественно.

G>>Само собой. Очевидно, это делается для внутренних функций единицы линковки.


PD>Гм. А что такое внутренние функции ? Любые неэкспортируемые ?


Ну вот, скажем, для исполняемого модуля это вообще все функции. Для статически линкуемой библиотеки — возможны варианты (так как LTCG имеет теоретическую возможность пропатчить и ее интерфейс во время линковки). Для динамической — он вообще ничего не может сделать, и трогать вызовы не должен.

В деталях — понятно, что надо разбираться. Но также понятно, что мухлеж с calling convention — это в наши времена не просто возможно, но совершенно обыденное дело. С чего и начинали.

Так как у меня необходимости разбираться в деталях нет — я оставляю это тем, кому разбираться интересно. Когда надо будет — сам разберусь.
Re[17]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 14:17
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>>>Отстал ты от жизни, и в технологиях здорово компиляции плаваешь. Не обижайся, что на правду обижаться-то.


PD>>>Тоже не обижаюсь, уже давно на твои инвективы в мой адрес. Но я бы не стал делать далеко идущие выводы насчет того, что я тут знаю, а что нет. Посмотри хотя бы вот сюда


G>>Рассказывать мне о том, чего бы ты не стал делать, сразу после того, как ты это сделал — довольно комично. Посмотри хотя бы вот сюда


PD>Ну комично тебе так комично. Дело твое, мне это мало интересно. Если я (допустим) забыл об этом и вызвал тем самым твой смех — все, что могу сказать, что у тебя своеобразное чувство юмора.


Да. У меня и в самом деле своеобразное чувство юмора.

G>>Обсуждение предполагаемых тобой личных качеств, знаний, и прочих свойств собеседника, равно как и выдача оценок этим качествам, является переводом темы обсуждения на личности.


PD>В любом случае, так это или нет, но это касается именно той личности, о которой идет речь. А он ответил вот что


Ты путаешь, Павел. Он не согласился с тобой, а просто проявил в разговоре с тобой вежливость.

PD>Так что твоя защита тех, кто об этом никак не просил, выглядит несколько странно. Уж если я перешел на личности — он и должен был бы обидеться, если это так. Он не обиделся, зато обиделся ты и начал мне выговаривать.


А с чего ты взял, что я "обиделся", и кого-то "защищаю"? И с чего ты взял что вообще кто-то обязательно должен обижаться, когда ты переходишь на личности?

G>>Твоя фраза является переходом на личности независимо от того, была чья-то личность этим задета, или нет.


PD>Вообще-то несколько странно защищать права личности, если личность вовсе не заявляет, что эти права задеты.


Что-то тебя совсем понесло . Какие нафиг права?

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

Так понятнее? Впрочем, я не настаиваю, продолжай. Можешь мою личность пообсуждать, например.

G>>И так как ты не в личном письме это написал, а позволил себе высказаться на публике — нечего изумляться, какое публике до этого дело.


PD>Ну-ну. Ты себе роль некоего арбитра почему-то присвоил.


Ничего я себе не присваивал. Я обратил твое внимание, что ты переходишь на личности. Что тебе с этим делать, и как реагировать — твой выбор. Ты вот защитную позицию зачем-то занял. Стыдно стало, наверно .

G>>Ну вот и славно. Хотя эти твои "я это знаю" — "ты этого не знаешь" — "как ты можешь говорить, что я чего-то не знаю?!" так забавны .


PD>А ссылочку можно, где я именно так сказал "как ты можешь говорить, что я чего-то не знаю" ? Мне как-то странно — не мог я такое сказать. Ссылочку , пожалуйста. Поиск дает только одно место — твое письмо, на которое я сейчас отвечаю.


Вверх письма отмотай. Увидишь:

Тоже не обижаюсь, уже давно на твои инвективы в мой адрес. Но я бы не стал делать далеко идущие выводы насчет того, что я тут знаю, а что нет.


Я не цитировал это, а описал твою реакцию. Сам ты позволяешь судить о других, и как только тебе это возвращают — искренне изумляешься, как о тебе-то судить можно?

А точно так же, как ты о других далеко идущие выводы делаешь. Было бы желания.

Чтобы у тебя повода обижаться не было — у меня нет желания делать выводы о том, что ты знаешь, а что нет. Это меня вообще не интересует. Личности собеседников мне по барабану, главное, что они по делу говорят.
Re[14]: Таки можно
От: Pavel Dvorkin Россия  
Дата: 12.10.10 14:28
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Pavel Dvorkin, Вы писали:


G>>>Одно можно сказать с уверенность — сейчас уж точно знаешь. А знал или не знал раньше — никакого значения не имеет. Ибо это ничего не меняет.


PD>>Ну тогда твоя позиция безупречна . Сейчас знаешь — благодаря твоему указанию. А знал ли раньше — значения не имеет. Что тут можно сказать ? Впрочем, ссылку насчет моего знания раньше я тебе уже послал.


G>Зачем тут вообще что-то говорить?


Не знаю. Я вел спокойную дискуссию с samius, оба были вполне ей довольны. Вдруг зачем-то налетел ты, аки вихрь и начал мне указывать, где и в чем я не прав, хотя какое тебе до моей с ним дискуссии дело — бог знает. Или просто некуда было энергию выплеснуть ? Примени ее в мирных целях. Вчера с тобой была нормальная дискуссия, я уж было решил, что с тобой дискутировать можно. Сегодня... то ли тебя твой начальник обидел, то ли , наоборот, подчиненные на тебя обиделись, в общем, образовался у тебя явный сгусток отрицательной энергии и ты решил его на меня выплеснуть.

G>Если ты не смог своими знаниями воспользоваться в обсуждении — то кому какая разница, были они у тебя до него, или нет? Я не вижу ни малейшего повода это выяснять. Мне не интересен ни факт их наличия у тебя на момент того, как я привел тебе ссылку, ни источник их получения. Веришь, нет?


Слушай, объясни мне ради бога, почему я должен тебе верить или нет и почему мне вообще должно быть интересно твое мнение обо мне ? Да бог с тобой совсем, думай что хочешь. В отличие от тебя я не стану тебе ничего указывать — пиши что хочешь, хоть о calling convention, хоть о своих озарениях, хоть обо мне. Мне это, прямо скажу, совершенно безразлично. Привел бы тут одну распространенную пословицу, да имея дело с таким обидчивым человеком, поостерегусь.

G>Чтобы облегчить твое состояние — я нашел ссылку про LTCG за минуту до того, как писал пост. Специально для тебя постарался. До этого момента я точно не знал, если ли вообще у MS такая технология, и как она называется. И совершенно по этому поводу не переживаю. Ибо я знаю уже настолько дохрена разных штук из самых разных областей (многие из которых не особо-то и нужны) — что могу уже себе с чистой совестью позволить не захламлять свой мозг всякой ерундой "на всякий случай".


Я готов этому поверить, но как же быть вот с этим

G>Да, все правильно. Получается, что должен ставить дефолтовый.


G>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли? Хотя я не знаю, насколько оно может быть осмысленным. Думать лень.


Я, конечно, приведу и ссылку.

http://rsdn.ru/forum/philosophy/3993168.aspx
Автор: Gaperton
Дата: 11.10.10


Это высказывание несколько не гармонирует с тем, что написано выше. Ну да ладно. Я рад за тебя, что ты знаешь "дохрена разных штук из самых разных областей" . Так держать, можно даже немного выше.


G>Короче, почему для тебя так важно доказать, что ты ни в коем случае не узнал про LTCG из моей ссылки, когда меня не интересует, откуда ты про это узнал — для меня загадка.


Ладно, дам тебе простую разгадку. Просто ты заявил, и не в очень вежливой форме, что я этого не знаю. Ну я спокойно и ответил, привел ссылку, вот и все, полагал, что вопрос исчерпан. Не ответь ты на нее — не о чем было бы и говорить. Что тебя так тут начало нервировать и с пеной у рта доказывать — не знаю, да и на что мне знать...


PD>>И тем не менее, в каких случаях она выполняется, а в каких нет — это еще вопрос. Не случайно там сказано, что компилятор должен иметь доступ ко всем вызовам. Может, при этом имеется в виду и вторая фаза, но тем не менее.


G>Там, строго говоря, этим линкер занимается, а не компилятор. И, когда он собирает exe, он, очевидно, имеет доступ ко всем вызовам. Кроме динамических либ, естественно.


Линкер, да, точнее, вторая фаза комиплятора, вызываемая из линкера, C2.DLL (если ее не переименовали)

G>>>Само собой. Очевидно, это делается для внутренних функций единицы линковки.


PD>>Гм. А что такое внутренние функции ? Любые неэкспортируемые ?


G>Ну вот, скажем, для исполняемого модуля это вообще все функции. Для статически линкуемой библиотеки — возможны варианты (так как LTCG имеет теоретическую возможность пропатчить и ее интерфейс во время линковки). Для динамической — он вообще ничего не может сделать, и трогать вызовы не должен.


Поэкспериментирую.

G>В деталях — понятно, что надо разбираться. Но также понятно, что мухлеж с calling convention — это в наши времена не просто возможно, но совершенно обыденное дело. С чего и начинали.


Да я и не спорю в принципе. Правжа, надо все же разобраться, кое в чем я не уверен. Но можно было же спокойно проаргументировать, а не устраивать истерические разносы.

G>Так как у меня необходимости разбираться в деталях нет — я оставляю это тем, кому разбираться интересно. Когда надо будет — сам разберусь.


Я рад за тебя.
With best regards
Pavel Dvorkin
Re[18]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 12.10.10 14:40
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Да. У меня и в самом деле своеобразное чувство юмора.


Имеешь полное право, но лучше бы оставил его для себя. У других оно несколько иное.

G>Ты путаешь, Павел. Он не согласился с тобой, а просто проявил в разговоре с тобой вежливость.


Слушай, хватит. Он, если бы хотел, мог сам сказать, что он об этом думает. Еще модераторы могут мне сделать замечание. А твои замечания мне надоели, равно как и соображения такого рода.

G>А с чего ты взял, что я "обиделся", и кого-то "защищаю"? И с чего ты взял что вообще кто-то обязательно должен обижаться, когда ты переходишь на личности?


См. выше.

G>Что-то тебя совсем понесло . Какие нафиг права?


Которые ты защищаешь. Права обиженного мной samius.

G>Не переходи в технической беседе на личности, это удел безмозглых пацанов, а не специалистов. Совершенно независимо от того, жалуется на тебя тот, чью личность ты обсуждаешь или нет.


Это все к нему или модератору, а посему skipped.

G>Так понятнее? Впрочем, я не настаиваю, продолжай. Можешь мою личность пообсуждать, например.


На кой , извини за грубость, ты мне сдался ?


G>Ничего я себе не присваивал. Я обратил твое внимание, что ты переходишь на личности. Что тебе с этим делать, и как реагировать — твой выбор. Ты вот защитную позицию зачем-то занял. Стыдно стало, наверно .


Ну и ну! Только дешевых подначек и не хватало.

G>>>Ну вот и славно. Хотя эти твои "я это знаю" — "ты этого не знаешь" — "как ты можешь говорить, что я чего-то не знаю?!" так забавны .


PD>>А ссылочку можно, где я именно так сказал "как ты можешь говорить, что я чего-то не знаю" ? Мне как-то странно — не мог я такое сказать. Ссылочку , пожалуйста. Поиск дает только одно место — твое письмо, на которое я сейчас отвечаю.


G>Вверх письма отмотай. Увидишь:

G>

G>Тоже не обижаюсь, уже давно на твои инвективы в мой адрес. Но я бы не стал делать далеко идущие выводы насчет того, что я тут знаю, а что нет.


И из этой фразы как-то следует, что я заявил : "как ты можешь говорить, что я чего-то не знаю" ? У тебя явно что-то не то с формальной логикой, потому как из того, что я сказал, это никак не следует.

G>Я не цитировал это, а описал твою реакцию.


Когда описывают чью-то реакцию — пишут в третьем лице и т.д. А когда ставят кавычки и текст в них — это называется цитирование. Или это называется приписыванием оппоненту того, что он не говорил, если нет ссылки. А ее нет. Так что поздравляю вас, гражданин, соврамши.

>Сам ты позволяешь судить о других, и как только тебе это возвращают — искренне изумляешься, как о тебе-то судить можно?


Да как хочешь суди, только не приписывай мне того, что я не говорил. Неприлично.

G>А точно так же, как ты о других далеко идущие выводы делаешь. Было бы желания.


Делай, на здоровье.

G>Чтобы у тебя повода обижаться не было — у меня нет желания делать выводы о том, что ты знаешь, а что нет. Это меня вообще не интересует. Личности собеседников мне по барабану, главное, что они по делу говорят.


Я же тебе сразу сказал — я на тебя давно не обижаюсь.
With best regards
Pavel Dvorkin
Re[15]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 15:41
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>>>Одно можно сказать с уверенность — сейчас уж точно знаешь. А знал или не знал раньше — никакого значения не имеет. Ибо это ничего не меняет.


PD>>>Ну тогда твоя позиция безупречна . Сейчас знаешь — благодаря твоему указанию. А знал ли раньше — значения не имеет. Что тут можно сказать ? Впрочем, ссылку насчет моего знания раньше я тебе уже послал.


G>>Зачем тут вообще что-то говорить?


PD>Не знаю. Я вел спокойную дискуссию с samius, оба были вполне ей довольны. Вдруг зачем-то налетел ты...


В этой ветке до самого верха мы с тобой разговариваем, и контекст совершенно другой. Давай смешивать все в кучу не будем.

PD>Слушай, объясни мне ради бога, почему я должен тебе верить или нет и почему мне вообще должно быть интересно твое мнение обо мне ?


С какой стати? Это твое личное дело, сам разбирайся.

PD>Я готов этому поверить, но как же быть вот с этим

G>>Да, все правильно. Получается, что должен ставить дефолтовый.
G>>Ну, если только компилятор не применяет эвристику, работающую на основе сигнатуры функции, не так ли? Хотя я не знаю, насколько оно может быть осмысленным. Думать лень.

PD>Это высказывание несколько не гармонирует с тем, что написано выше.


Если ты где-то углядел противоречие — скажи мне, где оно, и я тебе все объясню.

PD>Ну да ладно. Я рад за тебя, что ты знаешь "дохрена разных штук из самых разных областей" . Так держать, можно даже немного выше.


Оставь эти напутствия для своих студентов. Меня примерно лет 12 оценка моих успехов преподавателями не интересует.

G>>Короче, почему для тебя так важно доказать, что ты ни в коем случае не узнал про LTCG из моей ссылки, когда меня не интересует, откуда ты про это узнал — для меня загадка.


PD>Ладно, дам тебе простую разгадку. Просто ты заявил, и не в очень вежливой форме, что я этого не знаю.


Да ну? И ты этого, конечно, никак пережить не можешь? Как же так, ведь Павел Дворкин знает все на свете про все подряд, и в принципе не может чего-то не знать!

Ну давай разберемся, приведи цитату, где тебе показалось, что я это сказал. И посмотрим вместе, что же я там сказал, о чем, и в какой форме.

G>>В деталях — понятно, что надо разбираться. Но также понятно, что мухлеж с calling convention — это в наши времена не просто возможно, но совершенно обыденное дело. С чего и начинали.


PD>Да я и не спорю в принципе. Правжа, надо все же разобраться, кое в чем я не уверен. Но можно было же спокойно проаргументировать, а не устраивать истерические разносы.


Не устраивай. Разве заставляет кто?

G>>Так как у меня необходимости разбираться в деталях нет — я оставляю это тем, кому разбираться интересно. Когда надо будет — сам разберусь.


PD>Я рад за тебя.


А я за тебя. По существу вопроса, я так понял, у нас все?
Re[19]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 16:29
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Да. У меня и в самом деле своеобразное чувство юмора.


PD>Имеешь полное право, но лучше бы оставил его для себя. У других оно несколько иное.


Не только имею, но и признаю это право за окружающими. И, кстати, предлагаю тебе говорить за себя, а не за "других".

G>>Ты путаешь, Павел. Он не согласился с тобой, а просто проявил в разговоре с тобой вежливость.


PD>Слушай, хватит. Он, если бы хотел, мог сам сказать, что он об этом думает.


Но он не хочет. И потому — проявил вежливость.

PD>Еще модераторы могут мне сделать замечание.


Не, не могут. Не за что. Переходы на личности правилами не запрещены.

PD>А твои замечания мне надоели, равно как и соображения такого рода.


Ну мало ли кому что надоело. Мне, например, надоели переходы на личности "такого рода". Тебе пофигу? Значит, терпи.

G>>Что-то тебя совсем понесло . Какие нафиг права?


PD>Которые ты защищаешь. Права обиженного мной samius.


Тебе показалось. На самом деле, это обиженный ты упорно, из поста в пост, защищаешь свои права переходить на личности.
Re[15]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 16:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

И вообще, сколько слов, вместо того, чтобы просто сказать:
— Ух ты, какая оказывается классная штука LTCG! Вот ведь прогресс как шагнул — в наши-то времена ЕС ЕВМ такого-то не было. Спасибо за ссылку, Гапертон, ща разберемся!

А я бы тебе ответил:
— Не за что, дружище, я сам эту ссылку тока что нашел!

И все. А ты тут развел черт знает что с заламываниями рук.

Прости, но эффекта ты добился. Теперь, когда ты в очередной раз скажешь "я это знаю", я уж точно тебе не поверю . Уж слишком сильно ты боишься, что тебя в этом незнании уличат.

Ладно, ладно, не добился — поверю Шучу я, ничего личного. Чувство юмора своеобразное, сам понимаешь.
Re[15]: Таки можно
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 16:45
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

Ты, эта, вообще зря завелся. Повода нет.

Давай замнем. Извини, если что. Честно — не хотел. Все чувство юмора, мать его так!
Re[13]: Порядок вычисления аргументов
От: FR  
Дата: 12.10.10 18:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Если в заголовках нет (а там именно прототипы) — то в С++ нельзя (в С можно). Но это ничего не меняет.


Если знаем как выглядит ничего ни мешает хоть где написать extern void foo(int a, CFoo *p);
Re[18]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 19:03
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Ты путаешь, Павел. Он не согласился с тобой, а просто проявил в разговоре с тобой вежливость.


На самом деле я действительно согласился. Моя осведомленность в обсуждаемых материях представляет собой экстраполяцию домыслов. Можно считать что Павел проявил проницательность.
Re[4]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 19:38
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, samius, Вы писали:


B>>>Есть языки с так называемым "ленивым вычислением". Там аргументы вычисляются не при вызове функции, а при первом применении параметра. Т.е. их вычисление может вообще не понадобиться.


S>>Речь об энергичном языке.


FR>В некоторых энергичных языках есть ленивые параметры http://www.digitalmars.com/d/2.0/lazy-evaluation.html


это ведь энергичная передача делегата. Формально параметром является делегат, нет?
Re[20]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 20:02
Оценка:
Здравствуйте, samius, Вы писали:

G>>>Что-то тебя совсем понесло . Какие нафиг права?


PD>>Которые ты защищаешь. Права обиженного мной samius.


S>Блин Вы оба ставите меня в неловкое положение. Я тут отсутствовал какое-то время, а из-за меня такой шум! Право, не стоило оно того.


Ты тут вообще не причем

S>Извиняюсь, что не отвечал. Не знал, что будет похоже что я обиделся.


Не, не похоже ни разу. Все нормально

S>Но вообще говоря, это больше похоже на повод для выяснения отношений между вами.


Отчасти так. Объяснюсь.

1) Не люблю, когда вместо того, чтобы разговаривать по существу, переводят разговор на личности. Это признак слабости. В культурной благородной дискуссии — подобно удару по яйцам.

Преподавателю простительно, говоришь? Вдвойне непростительно преподавателю, ибо имеет в основе неспособность объяснить, переходящую в желание задавить авторитетом. Говно преподаватель, если он к такому прибегает в общении со студентом.

И даже если он к такому привык — ему не стоит путать каждого встречного со студентом хотя бы из чувства самосохранения. На студента он всегда имеет средство воздействия, какой бы бред не нес. Но не на независимых экспертов. И даже — на анонимов в форуме, которые могут оказаться кем угодно.

2) У нас с Павлом старые терки. Я как то нестерпел, когда он свои философские мысли начал про инженерию рассказывать. И дал ему ссылки на материалы по философии инженерной деятельности, с рядом своих комментариев. Внезапно выяснилось, что есть и такая дисциплина, ушедшая чуть дальше от доморощенных рассуждений. С тех пор, Павел меня ненавидит. Вернее не так — он ожидает от меня подставы, и посему заранее встает в защитную позицию.

Боится, сталбыть.

Что до переходов на личности — нас на первом курсе отучили орать с парты "у вас здесь ошибка", заменяя это просьбой "поясните этот переход", и внимательным отношением к таким просьбам. Основа этики научной дискуссии — нам говорили. Учитесь, деревенщины, глядишь, учеными станете.

А вот кого-то не отучили. И он преподает. Это прискорбно.
Re[21]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 21:40
Оценка:
Здравствуйте, samius, Вы писали:

S>Я и сам грешу переходами на личности.


Вот и отучайтесь. Уважительное отношение к ошибкам — основа инженерной этики. Ибо, не ошибается только тот, кто ничерта своими руками не делает. Павлу простительно. Инженерам и ученым — нет.

И кроме того, по настоящему грамотные пацаны и девчонки могут себе позволить и без этого обойтись. Тем более, что эффект получается гораздо сильнее, если вы оставляете делать вывод о личности собеседника читателю, а не навязываете ему этот вывод.

Литература-с. Ее законы работают и здесь.
Re[22]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 22:02
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, samius, Вы писали:


S>>Я и сам грешу переходами на личности.


G>Вот и отучайтесь. Уважительное отношение к ошибкам — основа инженерной этики. Ибо, не ошибается только тот, кто ничерта своими руками не делает. Павлу простительно. Инженерам и ученым — нет.


Я себе позволяю только после вбросов собеседника с переходом на личности множества людей (например всех дотнетчиков). А может мне хочется так думать. Буду отучаться.

G>И кроме того, по настоящему грамотные пацаны и девчонки могут себе позволить и без этого обойтись. Тем более, что эффект получается гораздо сильнее, если вы оставляете делать вывод о личности собеседника читателю, а не навязываете ему этот вывод.


Это слишком тонко для меня, а часто и для собеседника
Re[20]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.10 22:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

S>>На самом деле я действительно согласился. Моя осведомленность в обсуждаемых материях представляет собой экстраполяцию домыслов. Можно считать что Павел проявил проницательность.


G>То, что вы согласились — большой плюс Вам. Но не Павлу.


А почему вдруг на "Вы", если не секрет?
Re[22]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 12.10.10 22:54
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Gaperton, Вы писали:


G>>1) Не люблю, когда вместо того, чтобы разговаривать по существу, переводят разговор на личности. Это признак слабости. В культурной благородной дискуссии — подобно удару по яйцам.


S>Тут полно ньюансов. В частности, культуры и благородства стало сильно меньше, когда ты начал в этой ветке учить Павла манерам.


Ну что ж делат — придется применять сильнодействующие средства, и компенсировать "упадок культуры" латынью.

Post hoc, non propter hoc.
После не значит «вследствие»
После этого, следовательно вследствие этого (лат. post hoc ergo propter hoc) — логическая уловка, при которой отождествляется хронологическая, временная связь с причинно-следственной.


G>>Преподавателю простительно, говоришь? Вдвойне непростительно преподавателю, ибо имеет в основе неспособность объяснить, переходящую в желание задавить авторитетом. Говно преподаватель, если он к такому прибегает в общении со студентом.

S>Да, но это не про Павла. С говно-преподавателями я сталкивался на своем веку. И с говно-специалистами тоже. Сравнивать с ними Павла будет просто оскорблением для него.

Я понятия не имею, как Павел общается со студентами (нет никаких оснований полагать, что он во всех контекстах ведет себя одинаково, и в сети люди ведут себя не так, как в жизни), так что про него говорить не могу чисто технически .

Я сказал ровно то, что сказал — переходы на личности не могут быть оправданы профессией преподавателя. Это не профессиональное.
Re[20]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 13.10.10 06:30
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Вообще, давненько вообще мы с тобой не зацеплялись .


Давненько

G>Предлагаю замять. Извини, Павел .


No problems. Извини и меня, если где-то был слишком резок.

G>Но тока это, что больше не буду — обещать не могу. Знаю — буду!


With best regards
Pavel Dvorkin
Re[20]: Порядок вычисления аргументов
От: Pavel Dvorkin Россия  
Дата: 13.10.10 06:32
Оценка:
Здравствуйте, samius, Вы писали:

S>Блин Вы оба ставите меня в неловкое положение. Я тут отсутствовал какое-то время, а из-за меня такой шум! Право, не стоило оно того.


Извини, пожалуйста. Ты тут совершено ни при чем. Просто мы в очередной раз с Gaperton схлестнулись
With best regards
Pavel Dvorkin
Re[23]: Порядок вычисления аргументов
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.10.10 06:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

S>>Тут полно ньюансов. В частности, культуры и благородства стало сильно меньше, когда ты начал в этой ветке учить Павла манерам.

G>Ну что ж делат — придется применять сильнодействующие средства, и компенсировать "упадок культуры" латынью.
G>

G>Post hoc, non propter hoc.
G>После не значит «вследствие»
G>
После этого, следовательно вследствие этого (лат. post hoc ergo propter hoc) — логическая уловка, при которой отождествляется хронологическая, временная связь с причинно-следственной.


"Поясните этот переход!"
Re[21]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 13.10.10 07:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


S>>Блин Вы оба ставите меня в неловкое положение. Я тут отсутствовал какое-то время, а из-за меня такой шум! Право, не стоило оно того.


PD>Извини, пожалуйста. Ты тут совершено ни при чем. Просто мы в очередной раз с Gaperton схлестнулись


Ничего страшного.
Re[24]: Порядок вычисления аргументов
От: Gaperton http://gaperton.livejournal.com
Дата: 13.10.10 09:58
Оценка:
Здравствуйте, lomeo, Вы писали:

S>>>Тут полно ньюансов. В частности, культуры и благородства стало сильно меньше, когда ты начал в этой ветке учить Павла манерам.

G>>Ну что ж делат — придется применять сильнодействующие средства, и компенсировать "упадок культуры" латынью.
G>>

G>>Post hoc, non propter hoc.
G>>После не значит «вследствие»
G>>
После этого, следовательно вследствие этого (лат. post hoc ergo propter hoc) — логическая уловка, при которой отождествляется хронологическая, временная связь с причинно-следственной.


L>"Поясните этот переход!"


Поясняю.

"культуры и благородства стало сильно меньше, когда ты начал..."

После не значит вследствие.
Re[25]: Порядок вычисления аргументов
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.10.10 10:20
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Поясняю.


Спасыба, учитэл!
Re[5]: Порядок вычисления аргументов
От: FR  
Дата: 13.10.10 18:04
Оценка:
Здравствуйте, samius, Вы писали:

FR>>В некоторых энергичных языках есть ленивые параметры http://www.digitalmars.com/d/2.0/lazy-evaluation.html


S>это ведь энергичная передача делегата. Формально параметром является делегат, нет?


Это детали реализации, а по сути ленивые вычисления.
Да и параметром формально не делегат а любой тип, но он неявно преобразуется к делегату, ну и позволяет реализовать
даже простые управляющие конструкции (похоже на лисповское цитирование):


void dotimes(int count, lazy void exp)
{
    for (int i = 0; i < count; i++)
       exp();
}

int x = 0;
dotimes(10, writef(x++));
Re[6]: Порядок вычисления аргументов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 13.10.10 18:39
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, samius, Вы писали:


S>>это ведь энергичная передача делегата. Формально параметром является делегат, нет?


FR>Это детали реализации, а по сути ленивые вычисления.

FR>Да и параметром формально не делегат а любой тип, но он неявно преобразуется к делегату, ну и позволяет реализовать
FR>даже простые управляющие конструкции (похоже на лисповское цитирование):

FR>
FR>void dotimes(int count, lazy void exp)
FR>{
FR>    for (int i = 0; i < count; i++)
FR>       exp();
FR>}
FR>


Теперь то же самое, но другими словами:

void dotimes(int count, Lazy<void> exp)
{
    for (int i = 0; i < count; i++)
       exp.Exec();
}

Получили энергичный параметр шаблонного типа +/- сахар.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.