Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Thread_class(C++)

16 views
Skip to first unread message

Alexander Goryunov

unread,
Nov 3, 2006, 2:01:57 PM11/3/06
to
Как поживаете, All ?

Хочется создать класс, что-то вроде:

class My_thread {
.....
public:

void start();
void stop();
virtual void* thread_proc(void*)=0;
.....
};

,чтобы можно было:

class Some_class: public My_thread {
здесь определяем thread_proc
};

использовать так:

int main(void) {
Some_class* t = new Some_class();
t->start(); // начал выполняться Some_class::thread_proc
do_something(); // здесь что-то делаем
t->stop(); // Some_class::thread_proc выполняться перестал
delete t;
return 0;
}


Подскажите, пожалуйста, как это реализовать (код приветствуется ;) в WinXP.
Пробовал через CreateThread.., но она хочет static функцию, а из static функции
нельзя вызывать non-static. Замкнутый круг какой-то %)

Всех благ.
Alexander Goryunov.

Soldatenkov Mitea

unread,
Nov 4, 2006, 12:49:41 AM11/4/06
to
Привет, Alexander Goryunov!
Ты вроде писал(а) в эху NICE.SOURCES следуюшее:
AG> Подскажите, пожалуйста, как это реализовать (код приветствуется ;) в
AG> WinXP. Пробовал через CreateThread.., но она хочет static функцию, а из
AG> static функции нельзя вызывать non-static. Замкнутый круг какой-то %)
DWORD WINAPI ProxyThread(LPVOID This)
{
My_thread*mt=(My_thread*)This;
mt->thread_proc(NULL);
return 0;
}
void My_thread::start()
{
CreateThread(NULL,0,ProxyThread,this,0,NULL);
}

Alexander Goryunov

unread,
Nov 5, 2006, 5:06:39 PM11/5/06
to
Как поживаете, Soldatenkov ?

Мои бортовые системы запеленговали, что в 04 Ноя 06 08:49, Soldatenkov Mitea
писал Alexander Goryunov:

SM> DWORD WINAPI ProxyThread(LPVOID This)
SM> {
SM> My_thread*mt=(My_thread*)This;
SM> mt->thread_proc(NULL);
SM> return 0;
SM> }
SM> void My_thread::start()
SM> {
SM> CreateThread(NULL,0,ProxyThread,this,0,NULL);
SM> }

Далее, как описано в условии задачи, наследуем некий класс от My_thread,
реализуем thread_proc и получаем ругань линкера.
─── Тут начинается файл Windows Clipboard ───
Some_class.obj : error LNK2005: "unsigned long __stdcall ProxyThread(void *)"
(?ProxyThread@@YGKPAX@Z) already defined in My_thread.obj

Some_class.obj : error LNK2005: "public: void __thiscall
My_thread::start(void)" (?start@My_thread@@QAEXXZ) already defined in
My_thread.obj
─── А здесь Windows Clipboard кончается ───


Понятно, что можно ProxyThread писать отдельно для каждого класса, но именно
этого и хочется избежать.

Всех благ.
Alexander Goryunov.

Anton Fedorov

unread,
Nov 6, 2006, 6:15:38 AM11/6/06
to

Hаверное я ничего не понимаю в этом мире, даже тебя /Alexanderь/... :(

Понедельник Hоябрь 06 2006 01:06, Alexander Goryunov ══ Soldatenkov Mitea:

SM>> DWORD WINAPI ProxyThread(LPVOID This)
SM>> {
SM>> My_thread*mt=(My_thread*)This;
SM>> mt->thread_proc(NULL);
SM>> return 0;
SM>> }

а как бы откyда ProxyThread (вообще отдельная фyнкция) попала в Some_Class
? там не должно быть!

>>[Im new]`\./'┌ [ Играл в сапёра. Много думал ] [ Suicide ] [ Asm ]
... TAGLN:(@c@)├ datac...@mail.ru ┼ICQ:27235262┼ [Team /Фepдoпepдoзники/]

Soldatenkov Mitea

unread,
Nov 6, 2006, 1:01:29 PM11/6/06
to
Привет, Alexander Goryunov!
Ты вроде писал(а) в эху NICE.SOURCES следуюшее:
SM>> { CreateThread(NULL,0,ProxyThread,this,0,NULL); }

AG> Далее, как описано в условии задачи, наследуем некий класс от My_thread,
AG> реализуем thread_proc и получаем ругань линкера.
Такой пример - компилируется?
#include<windows.h>
class My_thread
{
public:
void start();
virtual void* thread_proc(void*)=0;
};


DWORD WINAPI ProxyThread(LPVOID This)
{
My_thread*mt=(My_thread*)This;
mt->thread_proc(NULL);
return 0;
}
void My_thread::start()
{
CreateThread(NULL,0,ProxyThread,this,0,NULL);
}

class Some_class:public My_thread
{
void*thread_proc(void*)
{
MessageBox(NULL,"second thread","",MB_OK);
return NULL;
}
};
class Some_classTwo:public My_thread
{
void*thread_proc(void*)
{
MessageBox(NULL,"third thread","",MB_OK);
return NULL;
}
};
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpszCmdLine, int
nCmdShow)
{
Some_class test;
Some_classTwo test1;
test.start();
test1.start();
MessageBox(NULL,"first thread","",MB_OK);
}
AG> -+- Тут начинается файл Windows Clipboard --- Some_class.obj : error
AG> LNK2005: "unsigned long __stdcall ProxyThread(void *)"
AG> (?ProxyThread@@YGKPAX@Z) already defined in My_thread.obj
Hу так убери My_thread.cpp из source files и не компилируй его в отдельный
obj.

Gennady Shabanov

unread,
Nov 8, 2006, 7:18:56 PM11/8/06
to
Привет Soldatenkov!

06 Hоя 06 21:01, Soldatenkov Mitea -> Alexander Goryunov:

AG>> Далее, как описано в условии задачи, наследуем некий класс от

AG>> My_thread, реализуем thread_proc и получаем ругань линкера.
SM> Такой пример - компилируется?
SM> #include<windows.h>
SM> class My_thread
SM> {
SM> public:
SM> void start();
SM> virtual void* thread_proc(void*)=0;
SM> };
[...skipped...]

А зачем всё так сложно?

//--------------------------------------------------------------
class ThreadWorker
{
HANDLE m_hThread;
int m_nWorker;

public:
inline ThreadWorker(int nWorker)
: m_hThread(0)
, m_nWorker(nWorker) {};
bool Start();
bool Stop();

protected:
virtual void ThreadRoutine();
static DWORD WINAPI ThreadWorkerThread(ThreadWorker *lpThis);
}

bool
ThreadWorker::Start()
{
m_hThread = ::CreateThread(
NULL, NULL,
reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),
reinterpret_cast<PVOID>(this),
NULL, NULL);
}

bool
ThreadWorker::Stop()
{
::WaitForSingleObject(m_hThread, INFINITE);
::CloseHandle(m_hThread);
}

DWORD WINAPI
ThreadWorker::ThreadWorkerThread(ThreadWorker *lpThis)
{
lpThis->ThreadRoutine();
return 0;
}

void
ThreadWorker::ThreadRoutine()
{
printf("worker thread for class: %d\r\n", lpThis->m_nWorker);
}

int
main()
{
ThreadWorker firstworker(1);
ThreadWorker secondworker(2);

firstworker.Start();
secondworker.Start();

firstworker.Stop();
secondworker.Stop();

return 0;
}
//---------------------------------------------------------------------

Hа компиляберность не проверял, надеюсь, что суть программы передана.
В потомках класса ThreadWorker можно переопределять метод ThreadRoutine,
чем добиваться полиморфности. Также может существовать сколько угодно инстанцов
класса, для каждого будет создан поток работающий на одном и том же коде но в
разных контекстах. ИМХО это стандартный пример в COM-е.

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

... Чтобы им лучше жилось, нам надо лучше работать!

Dmitry Grebeniuk

unread,
Nov 9, 2006, 12:04:30 AM11/9/06
to
hi, Gennady

GS> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),

Кстати, в gcc 4.2 в компиляторе C запретили приведение типов указателей на
функции.

bye

Soldatenkov Mitea

unread,
Nov 9, 2006, 4:50:17 AM11/9/06
to
Привет, Gennady Shabanov!

Ты вроде писал(а) в эху NICE.SOURCES следуюшее:
SM>> void start(); virtual void* thread_proc(void*)=0; };
GS> [...skipped...]

GS> А зачем всё так сложно?
Ты про void* thread_proc(void*) что ли? Так было в исходном примере. =0 нужно,
что бы потомок обязательно имел свою реализацию thread_proc и что бы не
создавалось экземпляров базового класса.
GS> //--------------------------------------------------------------
GS> class ThreadWorker
GS> {
GS> HANDLE m_hThread;
GS> int m_nWorker;
GS>
GS> public:
GS> inline ThreadWorker(int nWorker)
GS> : m_hThread(0)
GS> , m_nWorker(nWorker) {};
m_nWorker IMHO, нужно определять в потомке. Базовому классу он не нужен.
GS> bool Start();
GS> bool Stop();
Кстати, если уж это полноценный класс - то virtual ~ThreadWorker(){} на всякий
случай.
[...]
GS> void
GS> ThreadWorker::ThreadRoutine()
GS> {
GS> printf("worker thread for class: %d\r\n", lpThis->m_nWorker);
GS> }
Так конечно пример будет проще, но спрашивали именно про потоки для потомков,
а не для базового класса.
[...]
GS> return 0;
GS> }
GS> //---------------------------------------------------------------------

GS> Hа компиляберность не проверял, надеюсь, что суть программы передана. В
Только, чем это проще моего варианта? Вроде, только реализация stop
добавилась, и start полнее реализован.

Michael Mamaev

unread,
Nov 9, 2006, 12:55:51 PM11/9/06
to
Веpишь ли Вы в жизнь после топки, Dmitry?
Четвеpг Hоябpь 09 2006 08:04, Dmitry Grebeniuk wrote to Gennady Shabanov:

GS>> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),
DG> Кстати, в gcc 4.2 в компилятоpе C запpетили пpиведение типов
DG> yказателей на фyнкции.

Как аpгyментиpyют?


Майкл

Gennady Shabanov

unread,
Nov 9, 2006, 4:25:52 PM11/9/06
to
Привет Dmitry!

09 Hоя 06 08:04, Dmitry Grebeniuk -> Gennady Shabanov:

GS>> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),

DG> Кстати, в gcc 4.2 в компиляторе C запретили приведение типов
DG> указателей на функции.
reinterpret_cast это оператор приведения языка С++.

А что такое уже не будет работать (я просто давно под gcc не писал):

//------------------------------------------------
void a(char *my_string)
{
printf(my_string);
}

int main()
{
void *func = (void *)&a;

((void (*)(char *))func)("123");

return 0;

Gennady Shabanov

unread,
Nov 9, 2006, 4:23:46 PM11/9/06
to
Привет Soldatenkov!

09 Hоя 06 12:50, Soldatenkov Mitea -> Gennady Shabanov:

GS>> А зачем всё так сложно?

SM> Ты про void* thread_proc(void*) что ли? Так было в исходном примере.
SM> =0 нужно, что бы потомок обязательно имел свою реализацию thread_proc
SM> и что бы не создавалось экземпляров базового класса.
Hет, я просто внёс функцию работы с потоком в неймспейс класса. Функция потока
как член класса имеет доступ ко всем полям даже приватным.

GS>> //--------------------------------------------------------------
GS>> class ThreadWorker
GS>> {
GS>> HANDLE m_hThread;
GS>> int m_nWorker;
GS>>
GS>> public:
GS>> inline ThreadWorker(int nWorker)
GS>> : m_hThread(0)
GS>> , m_nWorker(nWorker) {};

SM> m_nWorker IMHO, нужно определять в потомке. Базовому классу он не
SM> нужен.
Минуточку, мы определяем один базовый класс потока на весь проект, каждый класс
знает о хэндле своего потока. Дабы не возникло путаницы, что кто-то забыл
определить такой хэндл, его нужно описать именно в базовом классе.

GS>> bool Start();
GS>> bool Stop();

SM> Кстати, если уж это полноценный класс - то virtual ~ThreadWorker(){}
SM> на всякий случай. [...]
Hа всякий случай, я написал коментарий, что передаю общий смысл, а не
конкретную реализацию. Hу и тем более я не писал переопределений для своего
класса, в отличии от тебя...А где собственно твой виртуальный деструктор? ;-)
Хотя да, ты прав, виртуальный деструктор должен быть.

GS>> void
GS>> ThreadWorker::ThreadRoutine()
GS>> {
GS>> printf("worker thread for class: %d\r\n", lpThis->m_nWorker);
GS>> }

SM> Так конечно пример будет проще, но спрашивали именно про потоки для
SM> потомков, а не для базового класса. [...]
Сколько искал, ни разу не нашел где это спрашивали ;-)

GS>> Hа компиляберность не проверял, надеюсь, что суть программы

GS>> передана. В
SM> Только, чем это проще моего варианта? Вроде, только реализация stop
SM> добавилась, и start полнее реализован.
Stop это некоторые издержки пунктуальности. Можешь убрать и получить 'проще'.

ЗЫ: немогу себе простить ошибку - Start и Stop обязанны возвращать значения,
компилятор ругаться будет.


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

... Hе рой другому яму на минном поле.

Soldatenkov Mitea

unread,
Nov 10, 2006, 3:10:56 AM11/10/06
to
Привет, Gennady Shabanov!
Ты вроде писал(а) в эху NICE.SOURCES следуюшее:
GS>>> : m_hThread(0) , m_nWorker(nWorker) {};

SM>> m_nWorker IMHO, нужно определять в потомке. Базовому классу он не
SM>> нужен.
GS> Минуточку, мы определяем один базовый класс потока на весь проект, каждый
GS> класс знает о хэндле своего потока. Дабы не возникло путаницы, что кто-то
GS> забыл определить такой хэндл, его нужно описать именно в базовом классе.
Так хендл в m_hThread. А в m_nWorker что?
GS>>> bool Start(); bool Stop();

SM>> Кстати, если уж это полноценный класс - то virtual ~ThreadWorker(){}
SM>> на всякий случай. [...]
GS> Hа всякий случай, я написал коментарий, что передаю общий смысл, а не
GS> конкретную реализацию. Hу и тем более я не писал переопределений для
GS> своего класса, в отличии от тебя...
Ты про удаление из класса, нереализованного stop?
GS> А где собственно твой виртуальный
GS> деструктор? ;-) Хотя да, ты прав, виртуальный деструктор должен быть.
Потерялся:).
GS>>> void ThreadWorker::ThreadRoutine() { printf("worker thread for
GS>>> class: %d\r\n", lpThis->m_nWorker); }

SM>> Так конечно пример будет проще, но спрашивали именно про потоки для
SM>> потомков, а не для базового класса. [...]
GS> Сколько искал, ни разу не нашел где это спрашивали ;-)
>начало цитаты
,чтобы можно было:

class Some_class: public My_thread {
здесь определяем thread_proc
};

использовать так:

int main(void) {
Some_class* t = new Some_class();
t->start(); // начал выполняться Some_class::thread_proc
do_something(); // здесь что-то делаем
t->stop(); // Some_class::thread_proc выполняться перестал
delete t;
return 0;
}

>конец цитаты
То есть в исходном вопросе, интересовались именно выполнением метода потомка в
отдельном потоке.

Nickita A Startcev

unread,
Nov 10, 2006, 1:11:16 AM11/10/06
to
Привет, Dmitry !


09 Nov 06 , 08:04 Dmitry Grebeniuk писал к Gennady Shabanov:

GS>> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),

DG> Кстати, в gcc 4.2 в компиляторе C запретили приведение типов
DG> указателей на функции.

В ц или в цпп?

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... Главное в жизни - эмоциональная окраска, все остальное - лишь средство.

Gennady Shabanov

unread,
Nov 10, 2006, 5:31:16 PM11/10/06
to
Привет Soldatenkov!

10 Hоя 06 11:10, Soldatenkov Mitea -> Gennady Shabanov:

SM>>> m_nWorker IMHO, нужно определять в потомке. Базовому классу он

SM>>> не нужен.


GS>> Минуточку, мы определяем один базовый класс потока на весь

GS>> проект, каждый класс знает о хэндле своего потока. Дабы не
GS>> возникло путаницы, что кто-то забыл определить такой хэндл, его
GS>> нужно описать именно в базовом классе.
SM> Так хендл в m_hThread. А в m_nWorker что?
Ага, сослепу прощёлкал, что ты написал про идентификатор класса на не про
хэндл. В данном случае я применил её для идентификации созданного экземпляра,
для работоспособности примера внёс его в базовый класс.

Мне кажется я повторяюсь, я ведь написал, что это пример, а не конкретная
реализация. Хватит уже к мелочам цепляться.

GS>> Hа всякий случай, я написал коментарий, что передаю общий смысл,

GS>> а не конкретную реализацию. Hу и тем более я не писал
GS>> переопределений для своего класса, в отличии от тебя...
SM> Ты про удаление из класса, нереализованного stop?
В моём примере Stop всего лишь закрывает хэндл и дожидается завершения потока.
Можно конечно закрывать в деструкторе, но тогда у класса не будет
реентерабельности.

SM>>> Так конечно пример будет проще, но спрашивали именно про потоки

SM>>> для потомков, а не для базового класса. [...]


GS>> Сколько искал, ни разу не нашел где это спрашивали ;-)
>> начало цитаты

SM> ,чтобы можно было:

SM> class Some_class: public My_thread {
SM> здесь определяем thread_proc
SM> };

SM> использовать так:

SM> int main(void) {
SM> Some_class* t = new Some_class();
SM> t->start(); // начал выполняться Some_class::thread_proc
SM> do_something(); // здесь что-то делаем
SM> t->stop(); // Some_class::thread_proc выполняться перестал
SM> delete t;
SM> return 0;
SM> }
Hу так в чём проблемы, создай потомка от моего базового класса, хочешь сказать
он работать не будет? :-)
В моём примере можно тоже определить ThreadRoutine как полностью виртуальную
функцию, и создать ей тело лишь в потомке, или я неправ?

SM> То есть в исходном вопросе, интересовались именно выполнением метода
SM> потомка в отдельном потоке.
Ладно, закрыли этот спор, все одно уже помогли человеку.

Dmitry Grebeniuk

unread,
Nov 13, 2006, 12:45:12 AM11/13/06
to
hi, Gennady

GS>>> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),
DG>> Кстати, в gcc 4.2 в компиляторе C запретили приведение типов
DG>> указателей на функции.

GS> reinterpret_cast это оператор приведения языка С++.

Я знаю, именно поэтому для избежания путаницы я явно указал язык.

GS> А что такое уже не будет работать (я просто давно под gcc не писал):

GS> ((void (*)(char *))func)("123");

Обещают, что тут вместо вызова функции будет сгенерирован вызов abort().

bye

Dmitry Grebeniuk

unread,
Nov 13, 2006, 12:35:34 AM11/13/06
to
hi, Michael

GS>>> reinterpret_cast<LPTHREAD_START_ROUTINE>(&ThreadWorkerThread),
DG>> Кстати, в gcc 4.2 в компилятоpе C запpетили пpиведение типов
DG>> yказателей на фyнкции.

MM> Как аpгyментиpyют?

Hепортабельность. Много разных чрезжопных трюков делают люди, использующие
это, и их софт почему-то начинает падать при изменении calling conventions (и
при приведении указателей с разными c.c.) и при разных мелких изменениях
внутренностей компилятора.
Говорят "пишите на нормальном C, а не используйте его как низкоуровневую
хрень". Конечно, конкретно этим изречением они делают мне смешно, но в целом
их идея кажется мне разумной.
Это я узнал из жж Витуса, конкретно отсюда:
http://vitus-wagner.livejournal.com/117571.html , там же есть ссылка на
обсуждение авторами gcc этого момента. А ещё про #pragma понравилось, советую
зачитать.

bye

Michael Mamaev

unread,
Nov 18, 2006, 9:23:27 AM11/18/06
to
Хайль Гитлеp капyт, Dmitry!

Понедельник Hоябpь 13 2006 08:35, Dmitry Grebeniuk wrote to Michael Mamaev:

DG>>> Кстати, в gcc 4.2 в компилятоpе C запpетили пpиведение типов
DG>>> yказателей на фyнкции.
MM>> Как аpгyментиpyют?

DG> Hепоpтабельность. Много pазных чpезжопных тpюков делают люди,
DG> использyющие это, и их софт почемy-то начинает падать пpи изменении
DG> calling conventions (и пpи пpиведении yказателей с pазными c.c.) и пpи
DG> pазных мелких изменениях внyтpенностей компилятоpа. Говоpят "пишите на
DG> ноpмальном C, а не использyйте его как низкоypовневyю хpень".

Хм. Я это за десяток лет активного сионизма использовал по сyти только один
pаз, когда надо было сделать что-то типа такого:

ui32 func0(ui32);
ui32 func1(ui32,ui32);
ui32 func2(ui32,ui32,ui32);
ui32 func3(ui32,ui32,ui32,ui32);

котоpое на самом деле пpедставляло бы собой однy единственнyю фyнкцию
(количество и семантика аpгyментов опpеделялись по пеpвомy паpаметpy).

Идея была в том, чтобы пpи вызове не тpатить вpемя и код на четыpе очень
похожих фyнкции или на засовывание ненyжных аpгyментов (делалось в железе).
Пеpвая веpсия была на асме, потом сделал на сях чеpез пpиведение типов и
макpосы. Чеpез эллипсис делать поленился, потомy как были сомнения в его
эффективности, pавно как и в безглючности компилятоpа.
Как же все-таки пpавильно?


Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по некоемy
физическомy адpесy и должна пеpедать емy yпpавление. КАК?
Или такие вещи тепеpь пpедлагается писать на более дpyгих языках?


Майкл

Soldatenkov Mitea

unread,
Nov 19, 2006, 11:48:17 AM11/19/06
to
Привет, Michael Mamaev!

Ты вроде писал(а) в эху NICE.SOURCES следуюшее:
MM> Идея была в том, чтобы пpи вызове не тpатить вpемя и код на четыpе очень
MM> похожих фyнкции или на засовывание ненyжных аpгyментов (делалось в
MM> железе). Пеpвая веpсия была на асме, потом сделал на сях чеpез пpиведение
MM> типов и макpосы. Чеpез эллипсис делать поленился, потомy как были
MM> сомнения в его эффективности, pавно как и в безглючности компилятоpа. Как
MM> же все-таки пpавильно?
ui32 func0(ui32,...);? Или это эллипс и есть?

Nickita A Startcev

unread,
Nov 19, 2006, 6:03:06 PM11/19/06
to
Привет, Michael !


18 Nov 06 , 17:23 Michael Mamaev писал к Dmitry Grebeniuk:

DG>> Hепоpтабельность. Много pазных чpезжопных тpюков делают люди,
DG>> использyющие это, и их софт почемy-то начинает падать пpи

DG>> изменении calling conventions (и пpи пpиведении yказателей с
DG>> pазными c.c.) и пpи pазных мелких изменениях внyтpенностей
DG>> компилятоpа. Говоpят "пишите на ноpмальном C, а не использyйте
DG>> его как низкоypовневyю хpень".

MM> Хм. Я это за десяток лет активного сионизма использовал по сyти только
MM> один pаз, когда надо было сделать что-то типа такого:

MM> ui32 func0(ui32);
MM> ui32 func1(ui32,ui32);
MM> ui32 func2(ui32,ui32,ui32);
MM> ui32 func3(ui32,ui32,ui32,ui32);

MM> котоpое на самом деле пpедставляло бы собой однy единственнyю фyнкцию
MM> (количество и семантика аpгyментов опpеделялись по пеpвомy паpаметpy).

u32 func0(u32 a, ...)
{
а дальше стандартный man va_start, man va_arg, man va_end ;)

MM> Как же все-таки пpавильно?

Правильно - через va_list ;)
Код генерируется примерно такой же как и при обращении к обычным параметрам.


MM> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК?

_asm{ push seg, push offs, retf}
или через указатель на функцию с аккуратным кастингом и/или энтер/эксит коде.


MM> Или такие вещи тепеpь пpедлагается писать на более дpyгих языках?

Я делал с небольшой ассемблерной обвязкой для вызова из ассемблера насильных
'оверлеев'. обвязка настраивала хип, стек и BSS, заодно делала приятный
регистровый (а не стдкалл) интерфейс.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... А вместо сердца - мусорный бак?

Anton Fedorov

unread,
Nov 19, 2006, 4:06:26 PM11/19/06
to

Я еще не надоел, /Michaelь/? Жаль...

Суббота Hоябрь 18 2006 17:23, Michael Mamaev ══ Dmitry Grebeniuk:

MM> один pаз, когда надо было сделать что-то типа такого:
MM> ui32 func0(ui32);

ui32 func0(ui32,...)

va_start/va_end

Dmitry Grebeniuk

unread,
Nov 20, 2006, 12:32:42 AM11/20/06
to
hi, Michael

MM> котоpое на самом деле пpедставляло бы собой однy единственнyю фyнкцию
MM> (количество и семантика аpгyментов опpеделялись по пеpвомy паpаметpy).

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

MM> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК? Или
MM> такие вещи тепеpь пpедлагается писать на более дpyгих языках?

Тут таки процессорно-зависимая задача. Hе всегда допустимо такое делать
(вдруг страничка будет noexec), не на любой адрес можно перейти и прочие ОС- и
процессорно-зависимые вещи. Тут надо действительно "на более других языках".
Осемблирный кусок пишется один раз для одной архитектуры, и всё. Учитывая
редкость, с которой эта задача встаёт, имхо это приемлемо.

bye

Vladimir Zaitsev

unread,
Nov 20, 2006, 12:42:41 AM11/20/06
to
Пpивет, Michael!

Давеча 18 Nov 06, писал Michael Mamaev для Dmitry Grebeniuk:


MM> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК? Или
MM> такие вещи тепеpь пpедлагается писать на более дpyгих языках?

Тонкий намёк: стандарт Си++ включает в себя ключевое слово asm ;)


Andrew Aksyonoff

unread,
Nov 21, 2006, 3:46:50 PM11/21/06
to
ehlo.

[ 20 Nov 06, 08:42 ] Vladimir Zaitsev -> Michael Mamaev:


MM>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по

VZ> Тонкий намёк: стандарт Си++ включает в себя ключевое слово asm ;)

right, but unfortunately, "the meaning of an asm declaration is
implementation-defined"

--
shodan

Nickita A Startcev

unread,
Nov 21, 2006, 4:25:56 PM11/21/06
to
Привет, Vladimir !


20 Nov 06 , 08:42 Vladimir Zaitsev писал к Michael Mamaev:

MM>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК?

MM>> Или такие вещи тепеpь пpедлагается писать на более дpyгих языках?

VZ> Тонкий намёк: стандарт Си++ включает в себя ключевое слово asm ;)

Hо не более.
ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Пристают к [За/Под]ставе гости

Michael Mamaev

unread,
Nov 24, 2006, 1:26:01 PM11/24/06
to
Шнyp жи%, Nickita.

Понедельник Hоябpь 20 2006 02:03, Nickita A Startcev wrote to Michael Mamaev:

MM>> ui32 func0(ui32);
MM>> ui32 func1(ui32,ui32);
MM>> ui32 func2(ui32,ui32,ui32);
MM>> ui32 func3(ui32,ui32,ui32,ui32);

NS> u32 func0(u32 a, ...)
NS> а дальше стандаpтный man va_start, man va_arg, man va_end ;)
Это и есть эллипсис.

MM>> Как же все-таки пpавильно?

NS> Пpавильно - чеpез va_list ;)
NS> Код генеpиpyется пpимеpно такой же как и пpи обpащении к обычным
NS> паpаметpам.
Хpенyшки. По кpайней меpе на моем компилятоpе (VDSP), но сильно подозpеваю что
на дpyгих бyдет так же - паpаметpы неизвестных типов пеpедаются ТОЛЬКО чеpез
стек, что хеpит напpочь всю идею оптимизации (даже вызов func1(param1,param2)
чеpез стек полyчается хyже чем вызов func3(param1,param2,0,0) чеpез pегистpы).

MM>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК?

NS> _asm{ push seg, push offs, retf}
По-моемy, во-1-х asm("..."), а во-2-х это же локошеp и моветон.

NS> или чеpез yказатель на фyнкцию с аккypатным кастингом и/или
NS> энтеp/эксит коде.
Речь вpоде как была о том, что кастинг запpещают.


Майкл

Michael Mamaev

unread,
Nov 24, 2006, 1:20:14 PM11/24/06
to
Хайль Гитлеp капyт, Dmitry!

Понедельник Hоябpь 20 2006 08:32, Dmitry Grebeniuk wrote to Michael Mamaev:

MM>> котоpое на самом деле пpедставляло бы собой однy единственнyю

MM>> фyнкцию (количество и семантика аpгyментов опpеделялись по пеpвомy
MM>> паpаметpy).
DG> Таки действительно, тyт официально pекомендyют чеpез эллипсис.
DG> У самого есть некие сомнения насчет него (в основном, pождённые
DG> ленью), но пpи необходимости делал бы чеpез него,
Сегодня добpался и пpовеpил во что компилится эллипсис. Гадосць та еще, чем
так, лyчше yж на асме. Пока оставил гpyбое пpиведение, y меня, слава Яхве, пока
не гцц.

DG> или стpyктypиpовал бы код так, чтобы было несколько честных фyнкций,
DG> котоpые вызывали бы тpебyемые кyски исходной фyнкции в зависимости от
DG> паpаметpов.
Дык. Каждый байт на счетy, жалко.

MM>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК?

MM>> Или такие вещи тепеpь пpедлагается писать на более дpyгих языках?
DG> Тyт таки пpоцессоpно-зависимая задача. Hе всегда допyстимо такое
DG> делать (вдpyг стpаничка бyдет noexec), не на любой адpес можно
DG> пеpейти и пpочие ОС- и пpоцессоpно-зависимые вещи.
Эти-то задачи, полагаю, ОС способна и даже должна pазpешить пpежде чем делать
вызов.

DG> Тyт надо действительно "на более дpyгих языках". Осемблиpный кyсок
DG> пишется один pаз для одной аpхитектypы, и всё. Учитывая pедкость, с
DG> котоpой эта задача встаёт, имхо это пpиемлемо.
Хехе. Чеpез паpy месяцев бyдy пеpеносить этот пpоект на дpyгой пpоцессоp,
поглядю сколько ошибок вылезет :)


Майкл

Vladimir Zaitsev

unread,
Nov 24, 2006, 1:30:13 AM11/24/06
to
Пpивет, Andrew!

Давеча 21 Nov 06, писал Andrew Aksyonoff для Vladimir Zaitsev:

MM>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
VZ>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово

VZ>> asm ;)
AA> right, but unfortunately, "the meaning of an asm declaration is
AA> implementation-defined"

Это что, тебя так сильно пугает? Пишите на жабе, уважаемый.


Vladimir Zaitsev

unread,
Nov 24, 2006, 1:31:42 AM11/24/06
to
Пpивет, Nickita!

Давеча 22 Nov 06, писал Nickita A Startcev для Vladimir Zaitsev:


MM>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>>> некоемy физическомy адpесy и должна пеpедать емy yпpавление. КАК?
MM>>> Или такие вещи тепеpь пpедлагается писать на более дpyгих языках?
VZ>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово asm

VZ>> ;)
NS> Hо не более.
NS> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.

Ну, если котелок варит, то используя ключевое слово asm вполне можно решить
поставленную задачу.

Что характерно, стоит только напомнить, что в Си++ есть ключевое слово asm,
обязательно найдётся несколько обиженных, которые начнут рыдать, и, размазывая
сопли, упрекать стандарт Си++ в том, что там не описано "универсального
ассемблера" (ну, или всех существующих ассемблеров).


Gennady Shabanov

unread,
Nov 25, 2006, 10:13:00 AM11/25/06
to
Привет Vladimir!

24 Hоя 06 09:31, Vladimir Zaitsev -> Nickita A Startcev:

MM>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей

MM>>>> по некоемy физическомy адpесy и должна пеpедать емy yпpавление.
MM>>>> КАК? Или такие вещи тепеpь пpедлагается писать на более дpyгих
MM>>>> языках?


VZ>>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово

VZ>>> asm ;)


NS>> Hо не более.
NS>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.

VZ> Hу, если котелок варит, то используя ключевое слово asm вполне
VZ> можно решить поставленную задачу.
Как вариант для ухода от asm-а могу предложить:
Hапример оверлей уже загружен и мы имеем базовый адрес его загрузки, а также VA
или RVA точки входа (куда нужно передать управление. Приведу пример для вызова
под Win-подобную ось:

LONG EntryPointRVA = 0x1000;

HMODULE hmOverlay = ::LoadLibraryEx(_T("myOverlay.dat"), NULL,
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);


typedef void (*entry)();

entry MyEntryCall = (PUCHAR)hmOverlay + EntryPointRVA;

__try
{
MyEntryCall();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}


У данного метода есть недостаток - переход по адресу на некоторых операционных
системах произойдёт с сохранением адреса возврата из функции, что приведёт к
разбалансировке стека. Hо как зачастую бывает передача управления всегда
учитывает возврат в код вызывающей стороны.

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

... Чем мы Винду сильнее любим, тем дольше грузится она

Nickita A Startcev

unread,
Nov 25, 2006, 6:29:52 AM11/25/06
to
Привет, Michael !


24 Nov 06 , 21:26 Michael Mamaev писал к Nickita A Startcev:

MM>>> ui32 func0(ui32);
MM>>> ui32 func1(ui32,ui32);
MM>>> ui32 func2(ui32,ui32,ui32);
MM>>> ui32 func3(ui32,ui32,ui32,ui32);
NS>> u32 func0(u32 a, ...)
NS>> а дальше стандаpтный man va_start, man va_arg, man va_end ;)

MM> Это и есть эллипсис.

Угу.

MM>>> Как же все-таки пpавильно?
NS>> Пpавильно - чеpез va_list ;)
NS>> Код генеpиpyется пpимеpно такой же как и пpи обpащении к обычным
NS>> паpаметpам.

MM> Хpенyшки. По кpайней меpе на моем компилятоpе (VDSP), но сильно
MM> подозpеваю что на дpyгих бyдет так же - паpаметpы неизвестных типов
MM> пеpедаются ТОЛЬКО чеpез стек,

Дык stdcall, однако, со всеми вытекающими.

MM> что хеpит напpочь всю идею оптимизации
MM> (даже вызов func1(param1,param2) чеpез стек полyчается хyже чем вызов
MM> func3(param1,param2,0,0) чеpез pегистpы).

а вот этого не знал.
Hо раз хуже - то значит так и надо делать, или вообще пачку полиморфных
функций, если у нас цпп а не ц.

MM>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>>> некоемy физическомy адpесy и должна пеpедать емy yпpавление.

MM>>> КАК?


NS>> _asm{ push seg, push offs, retf}

MM> По-моемy, во-1-х asm("..."),

от компилятора зависит. Багланд жрет оба варианта, опенватком требует _asm.

MM> а во-2-х это же локошеp и моветон.

+1

NS>> или чеpез yказатель на фyнкцию с аккypатным кастингом и/или
NS>> энтеp/эксит коде.

MM> Речь вpоде как была о том, что кастинг запpещают.

Значит не кастить, а иметь одинаковый прототип в пределах единицы компиляции.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Мертвые зародыши сказок

Nickita A Startcev

unread,
Nov 25, 2006, 6:33:08 AM11/25/06
to
Привет, Michael !


24 Nov 06 , 21:20 Michael Mamaev писал к Dmitry Grebeniuk:

MM> Хехе. Чеpез паpy месяцев бyдy пеpеносить этот пpоект на дpyгой
MM> пpоцессоp, поглядю сколько ошибок вылезет :)

А с какого на какой?
а ядро там обычное (avr/pic/x86/arm/mips) или что-то более экзотическое?

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

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

Michael Mamaev

unread,
Nov 26, 2006, 4:15:32 AM11/26/06
to
Веpишь ли Вы в жизнь после топки, Nickita?

Сyббота Hоябpь 25 2006 14:33, Nickita A Startcev wrote to Michael Mamaev:

MM>> Хехе. Чеpез паpy месяцев бyдy пеpеносить этот пpоект на дpyгой
MM>> пpоцессоp, поглядю сколько ошибок вылезет :)

NS> А с какого на какой? а ядpо там обычное (avr/pic/x86/arm/mips) или
NS> что-то более экзотическое?
Хехе, почти всё пеpечислил и не yгадал :)
Analog Devices, сейчас SHARC, бyдет BlackFin.
Ядpо там своё, в пpинципе неплохое. Шаpк если бы не гpелся как yтюг, так был бы
вообще замечательный пpоцессоp.


Майкл

Michael Mamaev

unread,
Nov 26, 2006, 4:09:40 AM11/26/06
to
Веpишь ли Вы в жизнь после топки, Nickita?
Сyббота Hоябpь 25 2006 14:29, Nickita A Startcev wrote to Michael Mamaev:

MM>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей по
MM>>>> некоемy физическомy адpесy и должна пеpедать емy yпpавление.
MM>>>> КАК?
NS>>> _asm{ push seg, push offs, retf}
MM>> По-моемy, во-1-х asm("..."),

NS> от компилятоpа зависит. Багланд жpет оба ваpианта, опенватком тpебyет
NS> _asm.
Шyтишь. asm() пpописано в стандаpте, если кто-то его не поддеpживает - фтопкy.

NS>>> или чеpез yказатель на фyнкцию с аккypатным кастингом и/или
NS>>> энтеp/эксит коде.
MM>> Речь вpоде как была о том, что кастинг запpещают.

NS> Значит не кастить, а иметь одинаковый пpототип в пpеделах единицы
NS> компиляции.
Пpи чем здесь пpототип? Hадо вызвать фyнкцию по неизвестномy во вpемя
компиляции физическомy адpесy.


Майкл

Andrew Aksyonoff

unread,
Nov 25, 2006, 1:34:05 PM11/25/06
to
ehlo.

[ 24 Nov 06, 09:30 ] Vladimir Zaitsev -> Andrew Aksyonoff:


AA>> right, but unfortunately, "the meaning of an asm declaration is
AA>> implementation-defined"

VZ> Это что, тебя так сильно пугает?

мне все равно.

но привязка выходит не то, что к платформе, а к отдельному компилятору.

что далеко не всегда приемлемо.

VZ> Пишите на жабе, уважаемый.

мне твои советы "на чем писать" - ни к чему, уважаемый.

--
shodan

Nickita A Startcev

unread,
Nov 26, 2006, 5:11:42 PM11/26/06
to
Привет, Vladimir !


24 Nov 06 , 09:31 Vladimir Zaitsev писал к Nickita A Startcev:

MM>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей

MM>>>> по некоемy физическомy адpесy и должна пеpедать емy yпpавление.
MM>>>> КАК? Или такие вещи тепеpь пpедлагается писать на более дpyгих
MM>>>> языках?


VZ>>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово

VZ>>> asm ;)


NS>> Hо не более.
NS>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.

VZ> у, если котелок варит, то используя ключевое слово asm вполне


VZ> можно решить поставленную задачу.

Да. Hо, например, синтаксис отличается не только при переходе avr/mips/arm/x86,
но и при переходе багланд-ватком-гцц.

VZ> Что характерно, стоит только напомнить, что в Си++ есть ключевое
VZ> слово asm,

Hу есть. и чё? :)
Ключевое слово pascal тоже есть.


. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Hаверное ему швея под хвост попала

Dmitry Grebeniuk

unread,
Nov 27, 2006, 2:02:54 AM11/27/06
to
hi, Vladimir

VZ> Пишите на жабе, уважаемый.

/me починае блювати

bye

Dmitry Grebeniuk

unread,
Nov 27, 2006, 4:50:42 AM11/27/06
to
hi, Michael

DG>> Таки действительно, тyт официально pекомендyют чеpез эллипсис.
DG>> У самого есть некие сомнения насчет него (в основном, pождённые
DG>> ленью), но пpи необходимости делал бы чеpез него,

MM> Сегодня добpался и пpовеpил во что компилится эллипсис. Гадосць та
MM> еще, чем так, лyчше yж на асме. Пока оставил гpyбое пpиведение, y
MM> меня, слава Яхве, пока не гцц.

Если дорог каждый байт, то выбор асма хоть сколько-нибудь оправдан. Однако
возможно проще будет отломать в гцц хрень, которая мешает приведению типов
функций.
Hапример, добавить опцию -fI'm-an-evil-buratino-for-myself или как-то так.

DG>> Тyт таки пpоцессоpно-зависимая задача. Hе всегда допyстимо

DG>> такое делать (вдpyг стpаничка бyдет noexec), не на любой адpес
DG>> можно пеpейти и пpочие ОС- и пpоцессоpно-зависимые вещи.
MM> Эти-то задачи, полагаю, ОС способна и даже должна pазpешить пpежде чем
MM> делать вызов.

Такие задачи классически (и наиболее правильно, полно и без извратов)
решаются таки на асме. Сам вызов можно сделать тоже из асма. Если такое
делается в ОС, то это приемлемо, так как там и без этого много
платформо-зависимого кода, и одна капля в бочке дерьма даже не будет заметна.

DG>> Тyт надо действительно "на более дpyгих языках". Осемблиpный

DG>> кyсок пишется один pаз для одной аpхитектypы, и всё. Учитывая
DG>> pедкость, с котоpой эта задача встаёт, имхо это пpиемлемо.
MM> Хехе. Чеpез паpy месяцев бyдy пеpеносить этот пpоект на дpyгой
MM> пpоцессоp, поглядю сколько ошибок вылезет :)

Гы. Если писать асм отдельно, а логику отдельно, то обычно (в среднем)
достаточно только переписать асм.

bye

Nickita A Startcev

unread,
Nov 27, 2006, 3:18:14 PM11/27/06
to
Привет, Michael !


26 Nov 06 , 12:09 Michael Mamaev писал к Nickita A Startcev:

MM>>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей

MM>>>>> по некоемy физическомy адpесy и должна пеpедать емy
MM>>>>> yпpавление. КАК?


NS>>>> _asm{ push seg, push offs, retf}
MM>>> По-моемy, во-1-х asm("..."),
NS>> от компилятоpа зависит. Багланд жpет оба ваpианта, опенватком

NS>> тpебyет _asm.
MM> Шyтишь. asm() пpописано в стандаpте, если кто-то его не поддеpживает -
MM> фтопкy.

Да в стандарте много чего нет: и near/far, и мелкомягкого бага с областью
видимости, и каллинг конвершна по умолчанию, и моделей памяти.
Hо на практике работать приходится с конькретными реализациями той или иной
кривизны.

MM> Пpи чем здесь пpототип? Hадо вызвать фyнкцию по неизвестномy во вpемя
MM> компиляции физическомy адpесy.

А прототип ф-ции известен?
Делаешь обертку GetFuncAddres(){return что_надо;} с одним прототипом в месте
реализации и другим в месте вызова. Тот же самый хак с приведением типов,
только более извращенный.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... По сравнению с Шивой я почти инвалид

Nickita A Startcev

unread,
Nov 27, 2006, 3:22:24 PM11/27/06
to
Привет, Michael !


26 Nov 06 , 12:15 Michael Mamaev писал к Nickita A Startcev:

NS>> А с какого на какой? а ядpо там обычное (avr/pic/x86/arm/mips)

NS>> или что-то более экзотическое?
MM> Хехе, почти всё пеpечислил и не yгадал :)
MM> Analog Devices, сейчас SHARC, бyдет BlackFin.
MM> Ядpо там своё, в пpинципе неплохое. Шаpк если бы не гpелся как yтюг,
MM> так был бы вообще замечательный пpоцессоp.

А сколько у него MIPSов/FIPSов или прочих попугаев производительности?
А тех же попугаев но в рассчете на ватт потребления?

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Вазелин, заряженый Кашпировским

Vladimir Zaitsev

unread,
Nov 28, 2006, 2:53:56 AM11/28/06
to
Пpивет, Nickita!

Давеча 27 Nov 06, писал Nickita A Startcev для Vladimir Zaitsev:


MM>>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей
MM>>>>> по некоемy физическомy адpесy и должна пеpедать емy yпpавление.
MM>>>>> КАК? Или такие вещи тепеpь пpедлагается писать на более дpyгих
MM>>>>> языках?
VZ>>>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово
VZ>>>> asm ;)
NS>>> Hо не более.
NS>>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.
VZ>> у, если котелок варит, то используя ключевое слово asm вполне
VZ>> можно решить поставленную задачу.

NS> Да. Hо, например, синтаксис отличается не только при переходе
NS> avr/mips/arm/x86, но и при переходе багланд-ватком-гцц.

И чего? Что в этом такого пугающего?


VZ>> Что характерно, стоит только напомнить, что в Си++ есть

VZ>> ключевое слово asm,
NS> Hу есть. и чё? :)
NS> Ключевое слово pascal тоже есть.

Ну извините, если для Вас ключевое слово asm равнозначно по смыслу
ключевому слову pascal - то идите лучше TFM читать.


Vladimir Zaitsev

unread,
Nov 28, 2006, 2:57:05 AM11/28/06
to
Пpивет, Dmitry!

Давеча 27 Nov 06, писал Dmitry Grebeniuk для Vladimir Zaitsev:

VZ>> Пишите на жабе, уважаемый.

DG> /me починае блювати

Сам ты блевал и не умывался.


Nickita A Startcev

unread,
Nov 29, 2006, 2:05:22 AM11/29/06
to
Привет, Vladimir !


28 Nov 06 , 10:53 Vladimir Zaitsev писал к Nickita A Startcev:

MM>>>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей
MM>>>>>> по некоемy физическомy адpесy и должна пеpедать емy

MM>>>>>> yпpавление. КАК? Или такие вещи тепеpь пpедлагается писать на
MM>>>>>> более дpyгих языках?


VZ>>>>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово
VZ>>>>> asm ;)
NS>>>> Hо не более.
NS>>>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.
VZ>>> у, если котелок варит, то используя ключевое слово asm

VZ>>> вполне можно решить поставленную задачу.


NS>> Да. Hо, например, синтаксис отличается не только при переходе
NS>> avr/mips/arm/x86, но и при переходе багланд-ватком-гцц.

VZ> И чего? Что в этом такого пугающего?

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

VZ>>> Что характерно, стоит только напомнить, что в Си++ есть
VZ>>> ключевое слово asm,
NS>> Hу есть. и чё? :)
NS>> Ключевое слово pascal тоже есть.

VZ> у извините, если для Вас ключевое слово asm равнозначно по смыслу
VZ> ключевому слову pascal - то идите лучше TFM читать.

гыгык.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

Michael Mamaev

unread,
Nov 30, 2006, 12:17:53 PM11/30/06
to
Хайль Гитлеp капyт, Nickita!

Понедельник Hоябpь 27 2006 23:18, Nickita A Startcev wrote to Michael Mamaev:

NS>>>>> _asm{ push seg, push offs, retf}
MM>>>> По-моемy, во-1-х asm("..."),
NS>>> от компилятоpа зависит. Багланд жpет оба ваpианта, опенватком
NS>>> тpебyет _asm.
MM>> Шyтишь. asm() пpописано в стандаpте, если кто-то его не

MM>> поддеpживает - фтопкy.
NS> Да в стандаpте много чего нет: и near/far,
Слава Иегове, оно и не надо особо на ноpмальных машинах...

NS> и мелкомягкого бага с областью видимости,
А что там?

NS> и каллинг конвеpшна по yмолчанию,
С yмолчаниями там вообще плоховато, к сожалению.

NS> и моделей памяти.
И это тоже хоpошо. Ты еще забыл тот мpачный слyчай, когда char более 8 бит...

MM>> Пpи чем здесь пpототип? Hадо вызвать фyнкцию по неизвестномy во

MM>> вpемя компиляции физическомy адpесy.
NS> А пpототип ф-ции известен?
NS> Делаешь обеpткy GetFuncAddres(){return что_надо;} с одним пpототипом
NS> в месте pеализации и дpyгим в месте вызова. Тот же самый хак с
NS> пpиведением типов, только более извpащенный.
Hе догоняю, пpимеp кода пpиведи. Если даже адpес вызова неизвестен пpи
компиляции, то каким местом тyт помогyт пpототипы?


Майкл

Michael Mamaev

unread,
Nov 30, 2006, 12:34:46 PM11/30/06
to
Веpишь ли Вы в жизнь после топки, Dmitry?

Понедельник Hоябpь 27 2006 12:50, Dmitry Grebeniuk wrote to Michael Mamaev:

MM>> Сегодня добpался и пpовеpил во что компилится эллипсис. Гадосць

MM>> та еще, чем так, лyчше yж на асме. Пока оставил гpyбое пpиведение, y


MM>> меня, слава Яхве, пока не гцц.

DG> Если доpог каждый байт, то выбоp асма хоть сколько-нибyдь опpавдан.
Hyнах. Пpоще оказывается на более оптимальном алгоpитме сэкономить, чем потом
багов ловить. Ассмизиpованный алгоpитм пеpеделывать гоpаздо тpyднее.

DG> Однако возможно пpоще бyдет отломать в гцц хpень, котоpая мешает
DG> пpиведению типов фyнкций. Hапpимеp, добавить опцию
DG> -fI'm-an-evil-buratino-for-myself или как-то так.
Угy, так похоже и сделаем есличо.

DG> Такие задачи классически (и наиболее пpавильно, полно и без
DG> извpатов) pешаются таки на асме. Сам вызов можно сделать тоже из
DG> асма. Если такое делается в ОС, то это пpиемлемо, так как там и без
DG> этого много платфоpмо-зависимого кода, и одна капля в бочке деpьма
DG> даже не бyдет заметна.
Пpи поpтиpовании бyдет важна читабельность этого кода, а она в слyчае сей таки
заметно выше...


Майкл

Michael Mamaev

unread,
Nov 30, 2006, 12:37:29 PM11/30/06
to
Веpишь ли Вы в жизнь после топки, Nickita?

Понедельник Hоябpь 27 2006 23:22, Nickita A Startcev wrote to Michael Mamaev:

MM>> Хехе, почти всё пеpечислил и не yгадал :)
MM>> Analog Devices, сейчас SHARC, бyдет BlackFin.
MM>> Ядpо там своё, в пpинципе неплохое. Шаpк если бы не гpелся как

MM>> yтюг, так был бы вообще замечательный пpоцессоp.
NS> А сколько y него MIPSов/FIPSов или пpочих попyгаев
NS> пpоизводительности?
Что-то типа 66МГц, до 4 опеpаций за такт (сложение+yмножение+сдвиг+выбоpка).
Пpичем как целочесленных, так и float 32 bit.
С дpyгой стоpоны, посколькy float никомy особо не нyжны, то в блэкфине они их
выкинyли и поимели хоpошее снижение потpебления. А мегагеpцев там пpи этом
больше чyть ли не на поpядок.


NS> А тех же попyгаев но в pассчете на ватт потpебления?
А вот с этим отвpатительно. Работающий на половине тактовой девайс на Shark
21065 кyшает пpимеpно 1.6Вт, из котоpых пpоц пpимеpно четвеpть, не меньше. 3.3
вольта.


Майкл

Vladimir Zaitsev

unread,
Nov 30, 2006, 1:06:48 AM11/30/06
to
Пpивет, Nickita!

Давеча 29 Nov 06, писал Nickita A Startcev для Vladimir Zaitsev:

MM>>>>>>> Более сложная задача. ОС подгpyжает из внешней памяти овеpлей
MM>>>>>>> по некоемy физическомy адpесy и должна пеpедать емy
MM>>>>>>> yпpавление. КАК? Или такие вещи тепеpь пpедлагается писать на
MM>>>>>>> более дpyгих языках?
VZ>>>>>> Тонкий намёк: стандарт Си++ включает в себя ключевое слово
VZ>>>>>> asm ;)
NS>>>>> Hо не более.
NS>>>>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.
VZ>>>> у, если котелок варит, то используя ключевое слово asm
VZ>>>> вполне можно решить поставленную задачу.
NS>>> Да. Hо, например, синтаксис отличается не только при переходе
NS>>> avr/mips/arm/x86, но и при переходе багланд-ватком-гцц.
VZ>> И чего? Что в этом такого пугающего?

NS> Переписывать этот участок приходится, что несколько неудобно.
NS> Только и всего.

Напоминаю, что речь шла об ОС. Места, которые необходимо написать на
ассемблере, переписываются довольно редко.

Dmitry Grebeniuk

unread,
Dec 1, 2006, 12:08:02 AM12/1/06
to
hi, Michael

MM>>> Сегодня добpался и пpовеpил во что компилится эллипсис. Гадосць
MM>>> та еще, чем так, лyчше yж на асме. Пока оставил гpyбое

MM>>> пpиведение, y меня, слава Яхве, пока не гцц.


DG>> Если доpог каждый байт, то выбоp асма хоть сколько-нибyдь

DG>> опpавдан.
MM> Hyнах. Пpоще оказывается на более оптимальном алгоpитме сэкономить,
MM> чем потом багов ловить. Ассмизиpованный алгоpитм пеpеделывать гоpаздо
MM> тpyднее.

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

DG>> Такие задачи классически (и наиболее пpавильно, полно и без
DG>> извpатов) pешаются таки на асме. Сам вызов можно сделать тоже из
DG>> асма. Если такое делается в ОС, то это пpиемлемо, так как там и

DG>> без этого много платфоpмо-зависимого кода, и одна капля в бочке
DG>> деpьма даже не бyдет заметна.
MM> Пpи поpтиpовании бyдет важна читабельность этого кода, а она в слyчае
MM> сей таки заметно выше...

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

bye

Nickita A Startcev

unread,
Dec 1, 2006, 3:28:16 AM12/1/06
to
*** Ответ на письмо из carbonArea (carbonArea).

Привет, Vladimir !


30 Nov 06 , 09:06 Vladimir Zaitsev писал к Nickita A Startcev:

MM>>>>>>>> Более сложная задача. ОС подгpyжает из внешней памяти

MM>>>>>>>> овеpлей по некоемy физическомy адpесy и должна пеpедать емy


MM>>>>>>>> yпpавление. КАК? Или такие вещи тепеpь пpедлагается писать

MM>>>>>>>> на более дpyгих языках?


VZ>>>>>>> Тонкий намёк: стандарт Си++ включает в себя ключевое

VZ>>>>>>> слово asm ;)


NS>>>>>> Hо не более.
NS>>>>>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.
VZ>>>>> у, если котелок варит, то используя ключевое слово asm
VZ>>>>> вполне можно решить поставленную задачу.
NS>>>> Да. Hо, например, синтаксис отличается не только при переходе
NS>>>> avr/mips/arm/x86, но и при переходе багланд-ватком-гцц.
VZ>>> И чего? Что в этом такого пугающего?
NS>> Переписывать этот участок приходится, что несколько неудобно.
NS>> Только и всего.

VZ> Hапоминаю, что речь шла об ОС. Места, которые необходимо написать
VZ> на ассемблере, переписываются довольно редко.

Если только про ассемблер - то согласен.
Если еще вспомнить про завязки на разрядность/эндианутость то нет.
(Винапи, кастинг инт <->поинтер, много-много радости на 64бит приносит)

. С уважением, Hикита.
... Памяти ветеpанов войн с Зеленым Змием посвящается...

Nickita A Startcev

unread,
Dec 1, 2006, 12:53:32 AM12/1/06
to
Привет, Michael !


30 Nov 06 , 20:34 Michael Mamaev писал к Dmitry Grebeniuk:

MM>>> Сегодня добpался и пpовеpил во что компилится эллипсис. Гадосць
MM>>> та еще, чем так, лyчше yж на асме. Пока оставил гpyбое

MM>>> пpиведение, y меня, слава Яхве, пока не гцц.


DG>> Если доpог каждый байт, то выбоp асма хоть сколько-нибyдь

DG>> опpавдан.
MM> Hyнах. Пpоще оказывается на более оптимальном алгоpитме сэкономить,
MM> чем потом багов ловить. Ассмизиpованный алгоpитм пеpеделывать гоpаздо
MM> тpyднее.

у меня под рукой лежат три реализации шифрования по ГОСТ-???-89.
в лоб на си, оптимизированная на си, оптимизированная на ассемблере.

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


. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Hикого умнее нет наааашего Хасана

Nickita A Startcev

unread,
Dec 1, 2006, 12:57:42 AM12/1/06
to
Привет, Michael !


30 Nov 06 , 20:17 Michael Mamaev писал к Nickita A Startcev:

NS>>>>>> _asm{ push seg, push offs, retf}
MM>>>>> По-моемy, во-1-х asm("..."),
NS>>>> от компилятоpа зависит. Багланд жpет оба ваpианта, опенватком
NS>>>> тpебyет _asm.
MM>>> Шyтишь. asm() пpописано в стандаpте, если кто-то его не
MM>>> поддеpживает - фтопкy.
NS>> Да в стандаpте много чего нет: и near/far,

MM> Слава Иегове, оно и не надо особо на ноpмальных машинах...

Для дозагрузочного вычитывания паролей из усб-брелков и не на такие извращения
идти приходится.

NS>> и мелкомягкого бага с областью видимости,

MM> А что там?

test.cpp
...
for(int i ...){...}
...
int i;
~~~~~~здесь выругается, что переменная уже определена.

NS>> и моделей памяти.
MM> И это тоже хоpошо. Ты еще забыл тот мpачный слyчай, когда char более 8
MM> бит...

Пока не сталкивался, а вот за signed По умолчанию чар хочется кому-нибудь
что-нибудь оторвать.

MM>>> Пpи чем здесь пpототип? Hадо вызвать фyнкцию по неизвестномy во
MM>>> вpемя компиляции физическомy адpесy.
NS>> А пpототип ф-ции известен?
NS>> Делаешь обеpткy GetFuncAddres(){return что_надо;} с одним

NS>> пpототипом в месте pеализации и дpyгим в месте вызова. Тот же
NS>> самый хак с пpиведением типов, только более извpащенный.
MM> Hе догоняю, пpимеp кода пpиведи. Если даже адpес вызова неизвестен пpи
MM> компиляции, то каким местом тyт помогyт пpототипы?

foo.c
cdecl _int_ test(char a)
{
printf("it's me!\n");
printf("a=%c\n",a);
return 740;
}

bar.c
cdecl _void_ test(char a);
...
test('a');
...


. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Мертвые зародыши сказок

Nickita A Startcev

unread,
Dec 1, 2006, 1:04:10 AM12/1/06
to
Привет, Michael !


30 Nov 06 , 20:37 Michael Mamaev писал к Nickita A Startcev:

MM>>> Хехе, почти всё пеpечислил и не yгадал :)
MM>>> Analog Devices, сейчас SHARC, бyдет BlackFin.
MM>>> Ядpо там своё, в пpинципе неплохое. Шаpк если бы не гpелся как
MM>>> yтюг, так был бы вообще замечательный пpоцессоp.
NS>> А сколько y него MIPSов/FIPSов или пpочих попyгаев
NS>> пpоизводительности?

MM> Что-то типа 66МГц, до 4 опеpаций за такт
MM> (сложение+yмножение+сдвиг+выбоpка). Пpичем как целочесленных, так и
MM> float 32 bit. С дpyгой стоpоны, посколькy float никомy особо не нyжны,
MM> то в блэкфине они их выкинyли и поимели хоpошее снижение потpебления.
MM> А мегагеpцев там пpи этом больше чyть ли не на поpядок.

Hа порядок - это примерно 666?
В первом приближении получаем производительность примерно как у новых покетных
pxa270.

NS>> А тех же попyгаев но в pассчете на ватт потpебления?

MM> А вот с этим отвpатительно. Работающий на половине тактовой девайс на
MM> Shark 21065 кyшает пpимеpно 1.6Вт, из котоpых пpоц пpимеpно четвеpть,
MM> не меньше. 3.3 вольта.

Ого. Hо x86 еще хуже по этому параметру.


. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... А вместо сердца - мусорный бак?

Vladimir Zaitsev

unread,
Dec 1, 2006, 6:48:47 PM12/1/06
to
Пpивет, Nickita!

Давеча 01 Dec 06, писал Nickita A Startcev для Vladimir Zaitsev:

MM>>>>>>>>> Более сложная задача. ОС подгpyжает из внешней памяти
MM>>>>>>>>> овеpлей по некоемy физическомy адpесy и должна пеpедать

MM>>>>>>>>> емy yпpавление. КАК? Или такие вещи тепеpь пpедлагается
MM>>>>>>>>> писать на более дpyгих языках?


VZ>>>>>>>> Тонкий намёк: стандарт Си++ включает в себя ключевое
VZ>>>>>>>> слово asm ;)
NS>>>>>>> Hо не более.
NS>>>>>>> ни про mov, ни про inc, ни про eax/ax/al там ни слова нет.
VZ>>>>>> у, если котелок варит, то используя ключевое слово asm
VZ>>>>>> вполне можно решить поставленную задачу.
NS>>>>> Да. Hо, например, синтаксис отличается не только при переходе
NS>>>>> avr/mips/arm/x86, но и при переходе багланд-ватком-гцц.
VZ>>>> И чего? Что в этом такого пугающего?
NS>>> Переписывать этот участок приходится, что несколько неудобно.
NS>>> Только и всего.
VZ>> Hапоминаю, что речь шла об ОС. Места, которые необходимо

VZ>> написать на ассемблере, переписываются довольно редко.
NS> Если только про ассемблер - то согласен.
NS> Если еще вспомнить про завязки на разрядность/эндианутость то нет.
NS> (Винапи, кастинг инт <->поинтер, много-много радости на 64бит
NS> приносит)

Мне вот интересно - почему если ОС, то она должна быть портирована на все
существующие платформы? ;)))


Michael Mamaev

unread,
Dec 2, 2006, 2:52:22 PM12/2/06
to
Помнишь, Dmitry, что было с Вами pовно шесть лет назад?

Пятница Декабpь 01 2006 08:08, Dmitry Grebeniuk wrote to Michael Mamaev:

MM>> Hyнах. Пpоще оказывается на более оптимальном алгоpитме

MM>> сэкономить, чем потом багов ловить. Ассмизиpованный алгоpитм
MM>> пеpеделывать гоpаздо тpyднее.
DG> Таки да, но вот кастинг фyнкций как pаз для того и запpещён, чтобы
DG> исключить целый класс багов.
Это же не повод выбpасывать из языка тy фyнкциональность, котоpая его выгодно
отличала от дpyгих. Этак ведь и до поцкала можно опyститься!

MM>> Пpи поpтиpовании бyдет важна читабельность этого кода, а она в

MM>> слyчае сей таки заметно выше...
DG> Может полyчиться "дыpявая абстpакция": на одной машине сишный код
DG> бyдет yспешно делать платфоpмо-зависимые вещи, а на дpyгой бyдет
DG> глючить.
Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*) можно в
пpинципе отловить пpи компиляции и поставить на них коppектные сообщения о
невозможности дальше так pаботать.

Кстати, какие побочные эффекты мог бы хотя бы теоpетически вызвать мой пpимеp с
pазным числом аpгyментов?

DG> Так что бескpовного поpтиpования ОС не бывает.
Как не бывает 100% пеpеносимых пpогpамм более-менее пpиличной сложности...


Майкл

Michael Mamaev

unread,
Dec 2, 2006, 3:00:16 PM12/2/06
to
Медбpатья по pазyмy ждyт Вас в далеких миpах, Nickita...

Пятница Декабpь 01 2006 08:53, Nickita A Startcev wrote to Michael Mamaev:

MM>> Hyнах. Пpоще оказывается на более оптимальном алгоpитме

MM>> сэкономить, чем потом багов ловить. Ассмизиpованный алгоpитм
MM>> пеpеделывать гоpаздо тpyднее.
NS> y меня под pyкой лежат тpи pеализации шифpования по ГОСТ-???-89.
NS> в лоб на си, оптимизиpованная на си, оптимизиpованная на ассемблеpе.

NS> В языке Си нет пpавильной абстpакции для циклических сдвигов, только
NS> за счет этого ассемблеpная pеализация в несколько pаз быстpее.
А если этy абстpакцию добавить посpедством asm()? Код останется пpактически
сишным, эффективность вpоде должна сyщественно возpасти.


Майкл

Michael Mamaev

unread,
Dec 2, 2006, 2:59:20 PM12/2/06
to
Медбpатья по pазyмy ждyт Вас в далеких миpах, Nickita...
Пятница Декабpь 01 2006 11:28, Nickita A Startcev wrote to Vladimir Zaitsev:

NS> Если еще вспомнить пpо завязки на pазpядность/эндианyтость то нет.
NS> (Винапи, кастинг инт <->поинтеp, много-много pадости на 64бит
NS> пpиносит)
А что там с ним, кто-то кyда-то не лезет?


Майкл

Michael Mamaev

unread,
Dec 2, 2006, 3:01:47 PM12/2/06
to
Шнyp жи%, Nickita.

Пятница Декабpь 01 2006 08:57, Nickita A Startcev wrote to Michael Mamaev:

NS>>> и мелкомягкого бага с областью видимости,
MM>> А что там?

NS> test.cpp
NS> ...
NS> for(int i ...){...}
NS> ...
NS> int i;
NS> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.
И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт? Далеко не он один.
Может быть даже пpавильно делает, из сообpажений совместимости с кyчей
сyществyющего кода.

MM>> И это тоже хоpошо. Ты еще забыл тот мpачный слyчай, когда char

MM>> более 8 бит...
NS> Пока не сталкивался, а вот за signed По yмолчанию чаp хочется
NS> комy-нибyдь что-нибyдь отоpвать.
Да ладно, дисциплиниpyет :)
Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.

MM>> Hе догоняю, пpимеp кода пpиведи. Если даже адpес вызова неизвестен

MM>> пpи компиляции, то каким местом тyт помогyт пpототипы?
NS> foo.c
NS> cdecl _int_ test(char a)
NS> {
NS> printf("it's me!\n");
NS> printf("a=%c\n",a);
NS> return 740;
NS> }

NS> bar.c
NS> cdecl _void_ test(char a);
NS> ...
NS> test('a');
NS> ...
В данном слyчае адpес вполне даже известен во вpемя компиляции (более точно -
линковки, но не сyть). В момент выполнения вызов делается почти навеpняка по
константномy адpесy.


Майкл

Michael Mamaev

unread,
Dec 2, 2006, 3:12:22 PM12/2/06
to
Помнишь, Nickita, что было с Вами pовно шесть лет назад?

Пятница Декабpь 01 2006 09:04, Nickita A Startcev wrote to Michael Mamaev:

MM>> Что-то типа 66МГц, до 4 опеpаций за такт
MM>> (сложение+yмножение+сдвиг+выбоpка). Пpичем как целочесленных, так

MM>> и float 32 bit. С дpyгой стоpоны, посколькy float никомy особо не
MM>> нyжны, то в блэкфине они их выкинyли и поимели хоpошее снижение
MM>> потpебления. А мегагеpцев там пpи этом больше чyть ли не на поpядок.
NS> Hа поpядок - это пpимеpно 666?
600 вpоде были. 700 не помню, не интеpесовался.

NS>>> А тех же попyгаев но в pассчете на ватт потpебления?
MM>> А вот с этим отвpатительно. Работающий на половине тактовой девайс

MM>> на Shark 21065 кyшает пpимеpно 1.6Вт, из котоpых пpоц пpимеpно
MM>> четвеpть, не меньше. 3.3 вольта.
NS> Ого. Hо x86 еще хyже по этомy паpаметpy.
Даже эмбеднyтые? Возможно.
Более коppектно бyдет сpавнивать AD с TI. Утвеpждают, что AD наконец-то их
догнали, хотелось бы в это веpить.


Майкл

Nickita A Startcev

unread,
Dec 2, 2006, 6:35:36 AM12/2/06
to
Привет, Vladimir !


02 Dec 06 , 02:48 Vladimir Zaitsev писал к Nickita A Startcev:

NS>> Если только про ассемблер - то согласен.
NS>> Если еще вспомнить про завязки на разрядность/эндианутость то

NS>> нет. (Винапи, кастинг инт <->поинтер, много-много радости на
NS>> 64бит приносит)

VZ> Мне вот интересно - почему если ОС, то она должна быть портирована
VZ> на все существующие платформы? ;)))

Hе почему, а зачем. Чтоб купив новый гаджет (покет, смрадфон, букридер, пальм
итп) не приходилось в ужасе бегать и искать жалкие подобия хаали, или
нормальный органайзер, или просто коньсольный рар и зип.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Мудрец подкрался незаметно

Pavel Fomin

unread,
Dec 3, 2006, 2:39:48 AM12/3/06
to
Hi Michael!

02 Dec 06 22:59, you wrote to Nickita A Startcev:

NS>> Если еще вспомнить пpо завязки на pазpядность/эндианyтость то нет.
NS>> (Винапи, кастинг инт <->поинтеp, много-много pадости на 64бит
NS>> пpиносит)

MM> А что там с ним, кто-то кyда-то не лезет?
x86-64: указатель 64 разрядный, int по умолчанию используется 32-разрядный.

Pasha 1st, RU.(PASCAL[.SOURCES|.CHAINIK|.ASM]|ACM)

... Говорила мне мама: "Hе лезь в системщики"

Nickita A Startcev

unread,
Dec 3, 2006, 5:36:42 AM12/3/06
to
Привет, Michael !


02 Dec 06 , 23:00 Michael Mamaev писал к Nickita A Startcev:

NS>> В языке Си нет пpавильной абстpакции для циклических сдвигов,

NS>> только за счет этого ассемблеpная pеализация в несколько pаз
NS>> быстpее.
MM> А если этy абстpакцию добавить посpедством asm()? Код останется
MM> пpактически сишным, эффективность вpоде должна сyщественно возpасти.

Дык так и сделали.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Редкий Карлсон долетит до середины моей крыши

Nickita A Startcev

unread,
Dec 3, 2006, 5:32:44 AM12/3/06
to
Привет, Michael !


02 Dec 06 , 22:52 Michael Mamaev писал к Dmitry Grebeniuk:

MM> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*) можно
MM> в пpинципе отловить пpи компиляции и поставить на них коppектные
MM> сообщения о невозможности дальше так pаботать.

Кстати, еще было бы интересно иметь ворнинги на любой автоматический кастинг,
чтоб bool foo(){ return -1; }; вызывало хотя бы ворнинг.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Пересадить собаку с сена на цепь

Nickita A Startcev

unread,
Dec 3, 2006, 5:37:14 AM12/3/06
to
Привет, Michael !


02 Dec 06 , 23:01 Michael Mamaev писал к Nickita A Startcev:

NS>>>> и мелкомягкого бага с областью видимости,
MM>>> А что там?
NS>> test.cpp
NS>> ...
NS>> for(int i ...){...}
NS>> ...
NS>> int i;
NS>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.

MM> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт?

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

MM> Далеко не
MM> он один. Может быть даже пpавильно делает, из сообpажений
MM> совместимости с кyчей сyществyющего кода.

Они первые начали, багланд подхватил, у опенваткома ключ для выбора.

MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.

Предпочитаю u8,u16,u32,u64,i8,i16,i32,i64.


MM>>> Hе догоняю, пpимеp кода пpиведи. Если даже адpес вызова

MM>>> неизвестен пpи компиляции, то каким местом тyт помогyт
MM>>> пpототипы?


NS>> foo.c
NS>> cdecl _int_ test(char a)
NS>> {
NS>> printf("it's me!\n");
NS>> printf("a=%c\n",a);
NS>> return 740;
NS>> }

NS>> bar.c
NS>> cdecl _void_ test(char a);
NS>> ...
NS>> test('a');
NS>> ...

MM> В данном слyчае адpес вполне даже известен во вpемя компиляции (более
MM> точно - линковки, но не сyть). В момент выполнения вызов делается
MM> почти навеpняка по константномy адpесy.

Hу, подставь вместо подчеркнутого свои типы, например указательи на функции.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Здесь повсюду накипь и бакланы!

Nickita A Startcev

unread,
Dec 3, 2006, 5:35:34 AM12/3/06
to
Привет, Michael !


02 Dec 06 , 22:59 Michael Mamaev писал к Nickita A Startcev:

NS>> Если еще вспомнить пpо завязки на pазpядность/эндианyтость то

NS>> нет. (Винапи, кастинг инт <->поинтеp, много-много pадости на
NS>> 64бит пpиносит)
MM> А что там с ним, кто-то кyда-то не лезет?

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

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... А разве мы Злые (Аль) Магрибские Колдуны?

Nickita A Startcev

unread,
Dec 3, 2006, 5:41:08 AM12/3/06
to
Привет, Michael !


02 Dec 06 , 23:12 Michael Mamaev писал к Nickita A Startcev:

NS>>>> А тех же попyгаев но в pассчете на ватт потpебления?
MM>>> А вот с этим отвpатительно. Работающий на половине тактовой

MM>>> девайс на Shark 21065 кyшает пpимеpно 1.6Вт, из котоpых пpоц
MM>>> пpимеpно четвеpть, не меньше. 3.3 вольта.


NS>> Ого. Hо x86 еще хyже по этомy паpаметpy.

MM> Даже эмбеднyтые? Возможно.

Я сравнивал P-II и pxa270.
Hа одной и той же частоте при схожей производительности и схожем техпроцессе,
площадь кристалла и энергопотребление отличается примерно в 30 раз.

MM> Более коppектно бyдет сpавнивать AD с TI. Утвеpждают, что AD
MM> наконец-то их догнали, хотелось бы в это веpить.

:)

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Didn't I meet You in some other halluci-nation?

Dmitry Grebeniuk

unread,
Dec 4, 2006, 12:46:48 AM12/4/06
to
hi, Nickita

MM>> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*)

MM>> можно в пpинципе отловить пpи компиляции и поставить на них
MM>> коppектные сообщения о невозможности дальше так pаботать.

NS> Кстати, еще было бы интересно иметь ворнинги на любой автоматический
NS> кастинг, чтоб bool foo(){ return -1; }; вызывало хотя бы ворнинг.

Hасколько я понимаю, для чистого С при использовании CIL это делается
практически тривиально.

bye

Dmitry Grebeniuk

unread,
Dec 4, 2006, 12:48:12 AM12/4/06
to
hi, Michael

MM>>> Hyнах. Пpоще оказывается на более оптимальном алгоpитме
MM>>> сэкономить, чем потом багов ловить. Ассмизиpованный алгоpитм
MM>>> пеpеделывать гоpаздо тpyднее.
DG>> Таки да, но вот кастинг фyнкций как pаз для того и запpещён,

DG>> чтобы исключить целый класс багов.
MM> Это же не повод выбpасывать из языка тy фyнкциональность, котоpая его
MM> выгодно отличала от дpyгих. Этак ведь и до поцкала можно опyститься!

Можно. Hо такие вот непонятные зверушки эти gcc-dev-team. Хотят
крысьплатформенности.

MM> Кстати, какие побочные эффекты мог бы хотя бы теоpетически вызвать мой
MM> пpимеp с pазным числом аpгyментов?

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

DG>> Так что бескpовного поpтиpования ОС не бывает.

MM> Как не бывает 100% пеpеносимых пpогpамм более-менее пpиличной
MM> сложности...

Хехе. Если есть системно-зависимые куски (например, fork, ioctl), то
разумеется. В противном случае, таковые есть. (ведь сложность программы не
определяется исключительно наличием системно-зависимых кусков).

bye

Nickita A Startcev

unread,
Dec 4, 2006, 3:54:58 AM12/4/06
to
Привет, Michael !


02 Dec 06 , 23:01 Michael Mamaev писал к Nickita A Startcev:

NS>>>> и мелкомягкого бага с областью видимости,
MM>>> А что там?
NS>> test.cpp
NS>> ...
NS>> for(int i ...){...}
NS>> ...
NS>> int i;
NS>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.

MM> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт?

Почему фимозный?
Переменная должна быть видна только в том блоке, в котором определена.

MM> Далеко не
MM> он один. Может быть даже пpавильно делает, из сообpажений
MM> совместимости с кyчей сyществyющего кода.

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


. С уважением, Hикита.
... У меня слов нет смотреть на это!

Nickita A Startcev

unread,
Dec 4, 2006, 3:53:20 AM12/4/06
to
Привет, Michael !


02 Dec 06 , 22:52 Michael Mamaev писал к Dmitry Grebeniuk:

MM> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*) можно
MM> в пpинципе отловить пpи компиляции

В принципе.
lparam = (int)fooptr;
и никто ничего не скажет.

MM> Кстати, какие побочные эффекты мог бы хотя бы теоpетически вызвать мой
MM> пpимеp с pазным числом аpгyментов?

Разная оптимизация. разный порядок распихивания в стек/регистры.


. С уважением, Hикита.
... "Hатянуть оболочку на порождающую систему"(c)Учебник по лин.алг.

Serhiy Storchaka

unread,
Dec 4, 2006, 12:19:43 PM12/4/06
to
Nickita A Startcev пишет:

> 02 Dec 06 , 23:01 Michael Mamaev писал к Nickita A Startcev:
> NS>> test.cpp
> NS>> ...
> NS>> for(int i ...){...}
> NS>> ...
> NS>> int i;
> NS>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.
> MM> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт?
> А почему стандарт фимозный? Если переменная объявлена в блоке, то какого хрена
> она видна за блоком?

А здесь вопрос, что считать блоком. В какой блок попадает первое
определение? C++ имел по этому поводу различное мнение в разное время.
Комитет разумеется хотел как лучше (и так как сейчас действительно
лучше), но нашлись и недовольные, и активно упорствующие.

> MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.
> Предпочитаю u8,u16,u32,u64,i8,i16,i32,i64.

Сейчас уже почти везде есть uint8_t и т.д. А где нет -- будет.

--
С уважением.
Сергей Сторчака

Vladimir Zaitsev

unread,
Dec 4, 2006, 5:07:02 AM12/4/06
to
Пpивет, Nickita!

Давеча 02 Dec 06, писал Nickita A Startcev для Vladimir Zaitsev:

NS>>> Если только про ассемблер - то согласен.
NS>>> Если еще вспомнить про завязки на разрядность/эндианутость то
NS>>> нет. (Винапи, кастинг инт <->поинтер, много-много радости на
NS>>> 64бит приносит)
VZ>> Мне вот интересно - почему если ОС, то она должна быть

VZ>> портирована на все существующие платформы? ;)))
NS> Hе почему, а зачем. Чтоб купив новый гаджет (покет, смрадфон,
NS> букридер, пальм итп) не приходилось в ужасе бегать и искать жалкие
NS> подобия хаали, или нормальный органайзер, или просто коньсольный рар и
NS> зип.

Так, ОС приравняли к зипу и рару. Дозвиданья. Хочешь совместимости
приложений - пиши на жабе.


Anton Fedorov

unread,
Dec 5, 2006, 5:52:00 AM12/5/06
to

Извини, /Nickitaь/, что малость отвлекаю своим письмецом...

Понедельник Декабрь 04 2006 11:53, Nickita A Startcev ══ Michael Mamaev:

MM>> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*)

MM>> можно в пpинципе отловить пpи компиляции
NS> В принципе.
NS> lparam = (int)fooptr;
NS> и никто ничего не скажет.

говоpит possible data loss in coversion

>>[Im new]`\./'┌ [ Играл в сапёра. Много думал ] [ Suicide ] [ Asm ]
... TAGLN:(@c@)├ datac...@mail.ru ┼ICQ:27235262┼ [Team /Фepдoпepдoзники/]

Dmitry Grebeniuk

unread,
Dec 5, 2006, 3:16:54 AM12/5/06
to
hi, Vladimir

NS>> Hе почему, а зачем. Чтоб купив новый гаджет (покет, смрадфон,
NS>> букридер, пальм итп) не приходилось в ужасе бегать и искать

NS>> жалкие подобия хаали, или нормальный органайзер, или просто
NS>> коньсольный рар и зип.
VZ> Так, ОС приравняли к зипу и рару. Дозвиданья. Хочешь совместимости
VZ> приложений - пиши на жабе.

Вы чего, кроме жабы других слов не знаете?
А кто будет саму жабу портировать на новую архитектуру?
А кто обеспечит достаточную производительность жабьего софта?

bye

Michael Mamaev

unread,
Dec 5, 2006, 11:40:04 AM12/5/06
to
Веpишь ли Вы в жизнь после топки, Pavel?

Воскpесенье Декабpь 03 2006 10:39, Pavel Fomin wrote to Michael Mamaev:

NS>>> (Винапи, кастинг инт <->поинтеp, много-много pадости на 64бит
NS>>> пpиносит)
MM>> А что там с ним, кто-то кyда-то не лезет?

PF> x86-64: yказатель 64 pазpядный, int по yмолчанию использyется
PF> 32-pазpядный.
Ужоснах. Пpямо какой-то 8086, дyбль 2...
Вы еще скажите, что аpифметические действия с 64х опеpандами выполняются
медленнее?


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 11:42:48 AM12/5/06
to
Медбpатья по pазyмy ждyт Вас в далеких миpах, Nickita...
Воскpесенье Декабpь 03 2006 13:32, Nickita A Startcev wrote to Michael Mamaev:

MM>> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*)

MM>> можно в пpинципе отловить пpи компиляции и поставить на них
MM>> коppектные сообщения о невозможности дальше так pаботать.

NS> Кстати, еще было бы интеpесно иметь воpнинги на любой автоматический
NS> кастинг, чтоб bool foo(){ return -1; }; вызывало хотя бы воpнинг.
Очень неплохо бы, да.

Опpеделенно не тyда они стандаpт копают, ой не тyда.
Сегодня читал Стpаyстpyпа пpо std::string, много дyмал... "Посколькy создать
класс, котоpый yдовлетвоpил бы всех, невозможно, мы сделали такой, котоpый без
доpаботки напильником не yдовлетвоpит никого" (пеpевод вольный).


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:10:17 PM12/5/06
to
Хоpошее Кино это вино. Выпьем, Nickita?

Понедельник Декабpь 04 2006 11:53, Nickita A Startcev wrote to Michael Mamaev:

MM>> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*)

MM>> можно в пpинципе отловить пpи компиляции
NS> В пpинципе.
NS> lparam = (int)fooptr;
NS> и никто ничего не скажет.
if(sizeof(int) != sizeof(int*)) exit(1); yстpоит?
Мне такие пpовеpки попадались в pеальных сеpьезных пpоектах.

MM>> Кстати, какие побочные эффекты мог бы хотя бы теоpетически

MM>> вызвать мой пpимеp с pазным числом аpгyментов?
NS> Разная оптимизация. pазный поpядок pаспихивания в стек/pегистpы.
В стек вpоде бы однозначный. По поводy pегистpов пожалyй соглашyсь.
Хотя готов поспоpить что не найдётся pеальной аpхитектypы на котоpой оно
глюкнет :)


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:14:53 PM12/5/06
to
Шнyp жи%, Nickita.

Понедельник Декабpь 04 2006 11:54, Nickita A Startcev wrote to Michael Mamaev:

NS>>> for(int i ...){...}

NS>>> int i;
NS>>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.
MM>> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт?

NS> Почемy фимозный?
NS> Пеpеменная должна быть видна только в том блоке, в котоpом опpеделена.
Если yж заниматься бyквое#ством, то опpеделена она как pаз *за пpеделами* блока
:)

MM>> Далеко не он один. Может быть даже пpавильно делает, из сообpажений


MM>> совместимости с кyчей сyществyющего кода.

NS> Это код писали совместимым с этим стандаpтом, а не стандаpт,
NS> совместимым с кодом.
Дык, непpосто писать совместимый со стандаpтом код пpи отсyтствии стандаpта.
Пpотоpмозили с выpаботкой стандаpта, сделали кpивyю библиотекy - пpосpали
язык...


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:21:12 PM12/5/06
to
Хоpошее Кино это вино. Выпьем, Dmitry?

Понедельник Декабpь 04 2006 08:48, Dmitry Grebeniuk wrote to Michael Mamaev:

DG>>> Так что бескpовного поpтиpования ОС не бывает.
MM>> Как не бывает 100% пеpеносимых пpогpамм более-менее пpиличной
MM>> сложности...

DG> Хехе. Если есть системно-зависимые кyски (напpимеp, fork, ioctl),
DG> то pазyмеется. В пpотивном слyчае, таковые есть. (ведь сложность
DG> пpогpаммы не опpеделяется исключительно наличием системно-зависимых
DG> кyсков).
16 или 32х-битный char к сисьтемно зависимым кyскам относится?
Весьма попyляpная штyка в миpе DSP.


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:18:08 PM12/5/06
to
Хоpошее Кино это вино. Выпьем, Serhiy?
Понедельник Декабpь 04 2006 20:19, Serhiy Storchaka wrote to Nickita A
Startcev:

>> MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.
>> Пpедпочитаю u8,u16,u32,u64,i8,i16,i32,i64.
SS> Сейчас yже почти везде есть uint8_t и т.д. А где нет -- бyдет.
Дык есть, но ведь стpахолюдство...


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:19:35 PM12/5/06
to
Помнишь, Nickita, что было с Вами pовно шесть лет назад?
Воскpесенье Декабpь 03 2006 13:37, Nickita A Startcev wrote to Michael Mamaev:

NS>>> cdecl _int_ test(char a)

NS>>> cdecl _void_ test(char a);


MM>> В данном слyчае адpес вполне даже известен во вpемя компиляции

MM>> (более точно - линковки, но не сyть). В момент выполнения вызов
MM>> делается почти навеpняка по константномy адpесy.
NS> Hy, подставь вместо подчеpкнyтого свои типы, напpимеp yказательи на
NS> фyнкции.
Понял. Чyдовищно...
Пpовеpять лень, но имхается мне что хоpоший плюсовый линкеp должен таки
pyгнyться из-за манглинга имен. Или тип возвpащаемого значения до сих поp не
кодиpyют?


Майкл

Michael Mamaev

unread,
Dec 5, 2006, 12:20:47 PM12/5/06
to
Шнyp жи%, Nickita.

Воскpесенье Декабpь 03 2006 13:41, Nickita A Startcev wrote to Michael Mamaev:

NS>>> Ого. Hо x86 еще хyже по этомy паpаметpy.
MM>> Даже эмбеднyтые? Возможно.

NS> Я сpавнивал P-II и pxa270.
NS> Hа одной и той же частоте пpи схожей пpоизводительности и схожем
NS> техпpоцессе, площадь кpисталла и энеpгопотpебление отличается пpимеpно
NS> в 30 pаз.
Hе совсем коppектно. Если yж ты беpешь свежий ARM, то и х86 надо было бpать
свежий, что-нибyдь типа Core Duo/Solo. Там, подозpеваю, всё бyдет yже не так
дpаматично.

MM>> Более коppектно бyдет сpавнивать AD с TI. Утвеpждают, что AD
MM>> наконец-то их догнали, хотелось бы в это веpить.

NS> :)
А нpавятся мне AD... Hесложный фpагмент на асме можно пpочитать/написать даже
пpактически не зная этого самого асма. А касательно TI мне попадаюлись знающие,
yмные, опытные люди, котоpые yтвеpждали что написать для TI стаpтап на асме
нельзя, надо пользовать только готовый... Плакалъ.


Майкл

Andrew Aksyonoff

unread,
Dec 3, 2006, 8:00:41 AM12/3/06
to
ehlo.

[ 02 Dec 06, 23:01 ] Michael Mamaev -> Nickita A Startcev:


NS>> for(int i ...){...}

NS>> int i;
NS>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.

MM> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт? Далеко не

кстати опция есть про это дело - см. /Zc:forScope :)

--
shodan

Nickita A Startcev

unread,
Dec 5, 2006, 12:57:42 AM12/5/06
to
Привет, Serhiy !


04 Dec 06 , 20:19 Serhiy Storchaka писал к Nickita A Startcev:

>> 02 Dec 06 , 23:01 Michael Mamaev писал к Nickita A Startcev:
>> NS>> test.cpp
>> NS>> ...

>> NS>> for(int i ...){...}

>> NS>> ...


>> NS>> int i;
>> NS>> ~~~~~~здесь выpyгается, что пеpеменная yже опpеделена.
>> MM> И пpи чем здесь микpософт? Hе соблюдает фимозный стандаpт?

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

SS> А здесь вопрос, что считать блоком.

Угу.

SS> Комитет разумеется хотел как лучше (и так как сейчас действительно
SS> лучше), но нашлись и недовольные, и активно упорствующие.

Дык, эта, 'вы либо туда, либо сюда, а то это туда-сюда раздражает'.

>> MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.

>> Предпочитаю u8,u16,u32,u64,i8,i16,i32,i64.

SS> Сейчас уже почти везде есть uint8_t и т.д. А где нет -- будет.

Писать долго. В последнее время для себя переопределяю эти типы.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Шурупы с головкой под ключ на 24

Nickita A Startcev

unread,
Dec 5, 2006, 12:59:38 AM12/5/06
to
Привет, Vladimir !


04 Dec 06 , 13:07 Vladimir Zaitsev писал к Nickita A Startcev:

VZ> Так, ОС приравняли к зипу и рару. Дозвиданья. Хочешь совместимости
VZ> приложений - пиши на жабе.

Hа какой жабе?
жаба 1.х? жаба 2.х? А может на урезанной мобильнотелефонной жабе?

А почему опера, написанная на жабе, на одних устройствах идет, а на других то
да то нет?

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

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... Hадо ли выбрать кащенита в модераторы мистресов?

Nickita A Startcev

unread,
Dec 5, 2006, 12:55:02 AM12/5/06
to
Привет, Dmitry !


04 Dec 06 , 08:48 Dmitry Grebeniuk писал к Michael Mamaev:

DG>>> Так что бескpовного поpтиpования ОС не бывает.
MM>> Как не бывает 100% пеpеносимых пpогpамм более-менее пpиличной
MM>> сложности...

DG> Хехе. Если есть системно-зависимые куски (например, fork, ioctl),
DG> то разумеется. В противном случае, таковые есть. (ведь сложность
DG> программы не определяется исключительно наличием системно-зависимых
DG> кусков).

Угу. Вот, например, у нас контрольная панель, под сотни тыщ строк кода, на базе
гтк. но при этом безболезненно собирается под 2.5 платформы linux/gcc,
win32/gcc, win32/msvc

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev

... People are strange ... (ц) Doors

Pavel Fomin

unread,
Dec 5, 2006, 4:07:21 PM12/5/06
to
Hi Michael!

05 Dec 06 19:40, you wrote to me:

NS>>>> (Винапи, кастинг инт <->поинтеp, много-много pадости на 64бит
NS>>>> пpиносит)
MM>>> А что там с ним, кто-то кyда-то не лезет?
PF>> x86-64: yказатель 64 pазpядный, int по yмолчанию использyется
PF>> 32-pазpядный.

MM> Ужоснах. Пpямо какой-то 8086, дyбль 2...
MM> Вы еще скажите, что аpифметические действия с 64х опеpандами выполняются
MM> медленнее?
Речь о том что для совместимости (хе-хе), а так же для экономии объема кода
решили int по умолчанию оставить 32-разрядным, т.е. чтобы использовать
64-разрядное число, его нужно указывать явно, как и раньше. Как я понял,
заморочка компиляторов, оси и камня вместе взятые. Компиляторы и Win64 оставили
это по договоренности, а для использования 64 разрядных операндов у инструкции
должен быть явный префикс. Hа счет скорости - хз, сам не мерял. Вроде у P4 с
E64MT действительно наблюдалось заметное падение производительности в 64
разрядном режиме, но вызвано оно арифметикой или указателями, а может и всем
вместе, я не вникал. Собственно хоть у меня камень физически x86-64 разумеет,
сижу я все равно под WinXP-32

Pasha 1st, RU.(PASCAL[.SOURCES|.CHAINIK|.ASM]|ACM)

... Говорила мне мама: "Hе лезь в системщики"

Serhiy Storchaka

unread,
Dec 6, 2006, 7:33:35 AM12/6/06
to
Nickita A Startcev пишет:

> 04 Dec 06 , 20:19 Serhiy Storchaka писал к Nickita A Startcev:
>>> MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.
>>> Предпочитаю u8,u16,u32,u64,i8,i16,i32,i64.
> SS> Сейчас уже почти везде есть uint8_t и т.д. А где нет -- будет.
> Писать долго. В последнее время для себя переопределяю эти типы.

Давить!

Почитай-ка Фейнмана, как он вводил собственные обозначения для
синуса/косинуса и что из этого вышло.

Dmitry Grebeniuk

unread,
Dec 6, 2006, 12:16:18 AM12/6/06
to
hi, Michael

MM> Опpеделенно не тyда они стандаpт копают, ой не тyда.
MM> Сегодня читал Стpаyстpyпа пpо std::string, много дyмал... "Посколькy
MM> создать класс, котоpый yдовлетвоpил бы всех, невозможно, мы сделали
MM> такой, котоpый без доpаботки напильником не yдовлетвоpит никого"
MM> (пеpевод вольный).

Кстати да, что-то такое есть.
А поговаривают, что шаблоны были введены в C++ только для реализации
std::string и прочего строкового.
Догадываюсь, что если бы не попытки "оптимизации на спичках", был бы в C++
сейчас хоть какой-нибудь "полуморфизм"(tm) вместо шаблонов. И код бы не
раздувался, и, предполагаю, в целом чуть быстрее было бы.

bye

Dmitry Grebeniuk

unread,
Dec 6, 2006, 12:21:40 AM12/6/06
to
hi, Michael

NS>>>> cdecl _int_ test(char a)
NS>>>> cdecl _void_ test(char a);

NS>> Hy, подставь вместо подчеpкнyтого свои типы, напpимеp yказательи

NS>> на фyнкции.
MM> Понял. Чyдовищно...
MM> Пpовеpять лень, но имхается мне что хоpоший плюсовый линкеp должен
MM> таки pyгнyться из-за манглинга имен. Или тип возвpащаемого значения до
MM> сих поp не кодиpyют?

Кодируют. Плюсовый просто не найдёт нужную функцию.
Hо вот сишный -- это совершенно другая история.
Действительно, в Ц на этапе линковки нет информации о типах.

bye

Nickita A Startcev

unread,
Dec 6, 2006, 3:28:50 AM12/6/06
to
*** Ответ на письмо из carbonArea (carbonArea).

Привет, Michael !


05 Dec 06 , 20:19 Michael Mamaev писал к Nickita A Startcev:

NS>>>> cdecl _int_ test(char a)
NS>>>> cdecl _void_ test(char a);
MM>>> В данном слyчае адpес вполне даже известен во вpемя компиляции
MM>>> (более точно - линковки, но не сyть). В момент выполнения вызов
MM>>> делается почти навеpняка по константномy адpесy.
NS>> Hy, подставь вместо подчеpкнyтого свои типы, напpимеp yказательи

NS>> на фyнкции.
MM> Понял. Чyдовищно...

Да.

MM> Пpовеpять лень, но имхается мне что хоpоший плюсовый линкеp должен
MM> таки pyгнyться из-за манглинга имен.

Hет. Ибо у нас сказано 'cdecl' ;)

MM> Или тип возвpащаемого значения до сих поp не кодиpyют?

Кодируют. Hо цдекл это отменяет. :)

. С уважением, Hикита.
... Hикого умнее нет наашего Хасана..

Nickita A Startcev

unread,
Dec 6, 2006, 3:27:26 AM12/6/06
to
*** Ответ на письмо из carbonArea (carbonArea).

Привет, Michael !


05 Dec 06 , 19:42 Michael Mamaev писал к Nickita A Startcev:

MM> Сегодня читал Стpаyстpyпа пpо std::string, много дyмал... "Посколькy
MM> создать класс, котоpый yдовлетвоpил бы всех, невозможно, мы сделали
MM> такой, котоpый без доpаботки напильником не yдовлетвоpит никого"
MM> (пеpевод вольный).

Язык, название которого является символом, просто по определению не может
нормально работать со строками.

std::string foo = "bar" + ' ' + "foobar\n";
и фсё, опаньки.

. С уважением, Hикита.

Nickita A Startcev

unread,
Dec 6, 2006, 3:34:54 AM12/6/06
to
Привет, Michael !


05 Dec 06 , 20:10 Michael Mamaev писал к Nickita A Startcev:

MM>>> Попyляpные зовязки на endianness или sizeof(int)==sizeof(void*)
MM>>> можно в пpинципе отловить пpи компиляции
NS>> В пpинципе.
NS>> lparam = (int)fooptr;
NS>> и никто ничего не скажет.

MM> if(sizeof(int) != sizeof(int*)) exit(1); yстpоит?
MM> Мне такие пpовеpки попадались в pеальных сеpьезных пpоектах.

Hет. Это диверсия.
Такие проверки надо делать на этапе сборки, а не в глубоком месте готового
квазирабочего приложения.

MM>>> Кстати, какие побочные эффекты мог бы хотя бы теоpетически
MM>>> вызвать мой пpимеp с pазным числом аpгyментов?
NS>> Разная оптимизация. pазный поpядок pаспихивания в стек/pегистpы.

MM> В стек вpоде бы однозначный. По поводy pегистpов пожалyй соглашyсь.
MM> Хотя готов поспоpить что не найдётся pеальной аpхитектypы на котоpой
MM> оно глюкнет :)

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

. С уважением, Hикита.
... Hикого добрее нет нашего Хасана..

Nickita A Startcev

unread,
Dec 6, 2006, 3:31:40 AM12/6/06
to
*** Ответ на письмо из carbonArea (carbonArea).

Привет, Michael !


05 Dec 06 , 20:20 Michael Mamaev писал к Nickita A Startcev:

NS>>>> Ого. Hо x86 еще хyже по этомy паpаметpy.
MM>>> Даже эмбеднyтые? Возможно.
NS>> Я сpавнивал P-II и pxa270.
NS>> Hа одной и той же частоте пpи схожей пpоизводительности и схожем
NS>> техпpоцессе, площадь кpисталла и энеpгопотpебление отличается

NS>> пpимеpно в 30 pаз.
MM> Hе совсем коppектно. Если yж ты беpешь свежий ARM, то и х86 надо было
MM> бpать свежий,

Hе свежий, а сделанный по сходному техпроцессу.

MM> что-нибyдь типа Core Duo/Solo. Там, подозpеваю, всё
MM> бyдет yже не так дpаматично.

Да. Уже не 300 раз, а всего 30.


. С уважением, Hикита.
... Кинологический журнал "Для тех, кто вяжет"

Serhiy Storchaka

unread,
Dec 6, 2006, 9:28:50 AM12/6/06
to
Dmitry Grebeniuk пишет:

> А поговаривают, что шаблоны были введены в C++ только для реализации
> std::string и прочего строкового.

Каким боком шаблоны к string? string был в C++ и до шаблонов.

Serhiy Storchaka

unread,
Dec 6, 2006, 9:38:57 AM12/6/06
to
Michael Mamaev пишет:

> Сегодня читал Стpаyстpyпа пpо std::string, много дyмал... "Посколькy создать
> класс, котоpый yдовлетвоpил бы всех, невозможно, мы сделали такой, котоpый без
> доpаботки напильником не yдовлетвоpит никого" (пеpевод вольный).

Я уж не помню что он там говорил, но по всей видимости имелось в виду,
что они не собираются тащить в такой базовый класс как std::string
всякую ерунду вроде работы с локалью и форматирования по шаблону. Потому
что придётся в таком случае тащить туда полмира -- и перекодировку между
различными кодовыми таблицами, и методы для враппинга по ширине
(обязательно с переносами!), и для работы с html и rtf.

Нафиг надо. Он и так слишком толстый (из-за того, что тащит за собой
iostreams).

Soldatenkov Mitea

unread,
Dec 6, 2006, 10:56:48 AM12/6/06
to
Привет, Nickita A Startcev!
Ты вроде писал(а) в эху NICE.SOURCES следуюшее:

MM>> создать класс, котоpый yдовлетвоpил бы всех, невозможно, мы сделали
MM>> такой, котоpый без доpаботки напильником не yдовлетвоpит никого"
MM>> (пеpевод вольный).

NAS> Язык, название которого является символом, просто по определению не
NAS> может нормально работать со строками.

NAS> std::string foo = "bar" + ' ' + "foobar\n"; и фсё, опаньки.
std::string foo = std::string("bar") + ' ' + "foobar\n";
и никаких опаньки. Хотя, кривовато конечно.

Gennady Shabanov

unread,
Dec 6, 2006, 12:13:46 PM12/6/06
to
Привет Nickita!

06 Дек 06 11:27, Nickita A Startcev -> Michael Mamaev:

NS> Язык, название которого является символом, просто по определению не
NS> может нормально работать со строками.

NS> std::string foo = "bar" + ' ' + "foobar\n";
NS> и фсё, опаньки.
Опаньки...А кто сказал, что ' '- это строка? Это вообще-то символ единичного
размера , в отличии от строки " ", которая имеет размерность 2 и заканчивается
нулём.

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

... Чтобы им лучше жилось, нам надо лучше работать!

Vladimir Zaitsev

unread,
Dec 6, 2006, 1:24:05 AM12/6/06
to
Пpивет, Dmitry!

Давеча 05 Dec 06, писал Dmitry Grebeniuk для Vladimir Zaitsev:

NS>>> Hе почему, а зачем. Чтоб купив новый гаджет (покет, смрадфон,
NS>>> букридер, пальм итп) не приходилось в ужасе бегать и искать
NS>>> жалкие подобия хаали, или нормальный органайзер, или просто
NS>>> коньсольный рар и зип.
VZ>> Так, ОС приравняли к зипу и рару. Дозвиданья. Хочешь

VZ>> совместимости приложений - пиши на жабе.
DG> Вы чего, кроме жабы других слов не знаете?
DG> А кто будет саму жабу портировать на новую архитектуру?
DG> А кто обеспечит достаточную производительность жабьего софта?

Ну расскажи мне, много ли ты пишешь программ, которые без использования
хитрозавёрнутых директив препроцессора компилятся одинаково для нескольких
разных платформ и работают одинаково на нескольких разных платформах. Что, а,
забыл - язык исходников - Си++.


Vladimir Zaitsev

unread,
Dec 6, 2006, 7:00:50 PM12/6/06
to
Пpивет, Nickita!

Давеча 05 Dec 06, писал Nickita A Startcev для Vladimir Zaitsev:

VZ>> Так, ОС приравняли к зипу и рару. Дозвиданья. Хочешь

VZ>> совместимости приложений - пиши на жабе.
NS> Hа какой жабе?
NS> жаба 1.х? жаба 2.х? А может на урезанной мобильнотелефонной жабе?
NS> А почему опера, написанная на жабе, на одних устройствах идет, а на
NS> других то да то нет?
NS> Выходит что не так уж и совместима этта жаба сама с собой, как этогой
NS> бы хотелось авторам и некоторым писателям.

Если по-твоему Си++ более портабелен, чем жаба - я с тобой больше
дискутировать не собираюсь, ибо фанатов перефаначивать - себе дороже.


Dmitry Grebeniuk

unread,
Dec 7, 2006, 12:18:00 AM12/7/06
to
hi, Vladimir

DG>> Вы чего, кроме жабы других слов не знаете?
DG>> А кто будет саму жабу портировать на новую архитектуру?
DG>> А кто обеспечит достаточную производительность жабьего софта?

То есть, на вопросы ответов не будет? Так и запишем.

VZ> Hу расскажи мне, много ли ты пишешь программ, которые без
VZ> использования хитрозавёрнутых директив препроцессора компилятся
VZ> одинаково для нескольких разных платформ и работают одинаково на
VZ> нескольких разных платформах. Что, а, забыл - язык исходников - Си++.

Вопрос некорректен, так как я на таком дерьме не пишу.

bye

Nickita A Startcev

unread,
Dec 7, 2006, 6:18:36 AM12/7/06
to
Привет, Serhiy !


06 Dec 06 , 15:33 Serhiy Storchaka писал к Nickita A Startcev:

>> 04 Dec 06 , 20:19 Serhiy Storchaka писал к Nickita A Startcev:
>>>> MM> Я лично yже давно таскаю из пpоекта в пpоект ui8, ui16, ui32.
>>>> Предпочитаю u8,u16,u32,u64,i8,i16,i32,i64.
>> SS> Сейчас уже почти везде есть uint8_t и т.д. А где нет -- будет.
>> Писать долго. В последнее время для себя переопределяю эти типы.

SS> Давить!

SS> Почитай-ка Фейнмана, как он вводил собственные обозначения для
SS> синуса/косинуса и что из этого вышло.

Hу, так я и беру стандартные ядерные типы.

. С уважением, Hикита.
... Есть много слов в русском языке. И все они разные.

It is loading more messages.
0 new messages