Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по CreateThread 
:(
    Опции темы
Rififi
Дата 31.3.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



yngwie19, 
это же C++ - "делай шо хочешь"
соответственно, если этот указатель превратить обратно в переменную целого типа, то проблем никаких и не будет.
PM MAIL   Вверх
Anikmar
Дата 31.3.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(yngwie19 @  31.3.2009,  22:16 Найти цитируемый пост)
 что-то не так?
Дак что получается была переменная - стал указатель и никаких проблем?


int и указатель не одно и тоже. Никто не гарантирует, что они будут одинакового размера. Передавать int в указателе считаю неправильным.
PM MAIL ICQ   Вверх
Alca
Дата 31.3.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Цитата

Передавать int в указателе считаю неправильным.

Тогда по ссылке


--------------------
PM WWW ICQ Skype Jabber   Вверх
Anikmar
Дата 31.3.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



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

Функция требует void* - значит ей надо передать любой указатель. Нельзя помещать в указатель другую информацию.
PM MAIL ICQ   Вверх
GoldFinch
Дата 1.4.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(Anikmar @  1.4.2009,  00:04 Найти цитируемый пост)
int и указатель не одно и тоже. Никто не гарантирует, что они будут одинакового размера. Передавать int в указателе считаю неправильным. 

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

Система не различает, указатели или значения передаются callback'ам, т.к. они просто копируются.
Более того, кроме C++ программы под win32 можно писать и на других языках программирования, например на *asm, так вот учитывая правила написания программ под win32 вообще, безотносительно языка программирования, в CreateThread параметром потоку можно передавать любые 4 байта.

Это сообщение отредактировал(а) GoldFinch - 1.4.2009, 08:53
PM MAIL ICQ   Вверх
Anikmar
Дата 1.4.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(GoldFinch @  1.4.2009,  08:43 Найти цитируемый пост)
Я бы понял если бы речь шла о кроссплатформенности, и то, размер указателя всегда больше или равен размеру int
Но речь идет о системной функции win32, и тут рассуждения о размере int и размере указателя совершенно бессмысленны, т.к. туда надо передавать только 4-байтовые значения, как int так и указателей

Система не различает, указатели или значения передаются callback'ам, т.к. они просто копируются.
Более того, кроме C++ программы под win32 можно писать и на других языках программирования, например на *asm, так вот учитывая правила написания программ под win32 вообще, безотносительно языка программирования, в CreateThread параметром потоку можно передавать любые 4 байта.


Я имею в виду не конкретно данную ситуацию, а подход вцелом. 
ИМХО. Если требуется указатель - надо передавать указатель, а не использовать левые преобразования

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



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Anikmar, а при чем тут подход в целом? тут вполне конкретный случай
и указатель там не требуется, это в заголовочных файлах С++ написано что указатель, а в заголовочных файлах для других языков, там не указатель
PM MAIL ICQ   Вверх
Anikmar
Дата 1.4.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(GoldFinch @  1.4.2009,  11:02 Найти цитируемый пост)
Anikmar, а при чем тут подход в целом? тут вполне конкретный случай
и указатель там не требуется, это в заголовочных файлах С++ написано что указатель, а в заголовочных файлах для других языков, там не указатель 


ИМХО
Есть интерфейс. Интерфейсу требуется указатель. Вот и надо его передать. Если рассматривать частные случаи, то С++ позволит сделать практически все. Я за общий подход, поэтому за то, чтобы не передавать в указателях целые параметры. И рассматривать заголовочные файлы других языков - это не разговор. Что за функция конкретно вызывается из exe, скомпилированного на С++ и какая из exe других языков заранее мы знать не можем. Конкретно в данном случае - известная функция, всем известно что она делает и я полностью согласен, что никакого вреда в этом случае не будет. Но лично я придерживаюсь другого стиля.
Опять-таки ИМХО


PM MAIL ICQ   Вверх
GoldFinch
Дата 1.4.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(Anikmar @  1.4.2009,  14:49 Найти цитируемый пост)
поэтому за то, чтобы не передавать в указателях целые параметры. 

там еще float можно передать
Цитата(Anikmar @  1.4.2009,  14:49 Найти цитируемый пост)
Что за функция конкретно вызывается из exe, скомпилированного на С++ и какая из exe других языков заранее мы знать не можем. Конкретно в данном случае - известная функция

вызов-то ее размещен в .exe, а сама-то функция во внешней .dll
кроме того, в ее интерфейсе указано соглашение вызова, stdcall, так вот согласно соглашению вызова stdcall разницы между указателем, целочисленным 4-байтовым значением, или любым другим 4-байтовым значением нет. 
и язык программирования, раз указано конкретное соглашение вызова, тут совершенно ни при чем.
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.4.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

ради справедливости, можешь поставить перед вызовом функции 
Код

assert( sizeof(int) <= sizeof(void*) )

и все проблемы решатся:
и совместимость не нарушена
и не нужно плодить лишний код

ИМХО, такого рода перестраховки - просто тараканы, о которых ты забудешь, как только начнешь задумываться о том, как сильно они сказываются на твоем КПД

Добавлено через 9 минут и 30 секунд
GoldFinch, слишком много ненужных подробностей,
и stdcall тут ни при чем: выравнивание стека параметров не равно размеру элемента, это всего лишь лишь его кратность


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Anikmar
Дата 2.4.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(GremlinProg @  1.4.2009,  15:17 Найти цитируемый пост)
Anikmar, все верно, пока речь не идет о производительности
так можно и не дойти до решения основной задачи,
а даже если дойти, то код уже будет неэффективным


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

Цитата(GoldFinch @  1.4.2009,  15:05 Найти цитируемый пост)
кроме того, в ее интерфейсе указано соглашение вызова, stdcall, так вот согласно соглашению вызова stdcall разницы между указателем, целочисленным 4-байтовым значением, или любым другим 4-байтовым значением нет.

Закладывать в свой код предположение о размере указателя и целого числа как 4 байта я и считаю отступлением от общего нормального подхода. Сколько байт точно вешать знает только sizeof. Если говорить о stdcall то данный модификатор лишь объявляет соглашение о вызове функции в совместимом с win32 формате. Никаких 4, а также 5, 6 или 8 байт он не предусматривает.
Соглашение лишь о порядке следования параметров и о способе передаче параметров по значению:
MSDN:
Цитата

Microsoft Specific 

The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.

return-type __stdcall function-name[(argument-list)] Remarks 
The following list shows the implementation of this calling convention.

Element  Implementation  
Argument-passing order
 Right to left.
 
Argument-passing convention
 By value, unless a pointer or reference type is passed.


Цитата(GremlinProg @  1.4.2009,  15:17 Найти цитируемый пост)
assert( sizeof(int) <= sizeof(void*) )

ИМХО. Данная вещь хороша при отладке. А закладывать в код вероятность вылета из-за кривого программирования - тут, конечно, дело вкуса, но не проще ли предусмотреть нормальную работу в любом варианте - тем более здесь не требуется особых наворотов.

Цитата(GremlinProg @  1.4.2009,  15:17 Найти цитируемый пост)
ИМХО, такого рода перестраховки - просто тараканы, о которых ты забудешь, как только начнешь задумываться о том, как сильно они сказываются на твоем КПД

Это не перестраховка, а просто мое мнение (и не только мое, кстати), что конструкций вида
Код

int a;
void *p;
...
p = (void*)a;


Нужно избегать. 

ИМХО.
PM MAIL ICQ   Вверх
GoldFinch
Дата 2.4.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Anikmar, будет выигрыш не только по производительности, но и по безопасности, не надо обеспечивать время жизни указателя на все время жизни потока
PM MAIL ICQ   Вверх
GoldFinch
Дата 2.4.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(Anikmar @  2.4.2009,  09:43 Найти цитируемый пост)
Закладывать в свой код предположение о размере указателя и целого числа как 4 байта я и считаю отступлением от общего нормального подхода. Сколько байт точно вешать знает только sizeof.

это в кроссплатформенном С\С++ это нормальный подход
а при работе с конкретной платформой, всегда надо знать и учитывать численные характеристики платформы

Цитата(Anikmar @  2.4.2009,  09:43 Найти цитируемый пост)
Соглашение лишь о порядке следования параметров и о способе передаче параметров по значению:

там в msdn написано далеко не все

более точное описание условий для вызова системных апи выглядит так
Цитата

следует соблюдать следующие условия для вызова системного апи(модель вызова не имеет значения, stdcall etc.):
> Стек выравнен на 4 байта.
> Страница стека доступна для чтения, записи и может быть расширена вниз при переполнении стека.
> Границы стека определены в TIB.
> Сброшен бит DF в регистре флагов.
> Изменяются регистры Eax, Ecx, Edx, Esp, EFlags.
> Валидные селекторы.

© Clerk (wasm.ru)

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(GoldFinch @  2.4.2009,  10:07 Найти цитируемый пост)
там в msdn написано далеко не все

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

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

У меня сложилось впечатление, что вы большой приверенженец ассемблера и из-за этого достаточно яростно отстаиваете подходы, которые часто применяют именно ASM-программеры. Касаемо текущего обсуждения общий фон такой: Да, это вроде как не совсем правильно, но в конкретном этом случае можно. Я же изначально сказал, что в общем (а не конкретном) подходе так делать не рекомендуют, и я сам так не делаю. Хотя бы из-за того, что код для виндов также должен переносится в более свежие версии и нужно делать максимально меньше подозрительных крякозябр. В этом случае ничего не произойдет, зато в другом случае можно потратить неделю на поиск ошибки. Легче приучить себя изначально делать правильно - и все будет ок.

Цитата(GoldFinch @  2.4.2009,  10:07 Найти цитируемый пост)
это в кроссплатформенном С\С++ это нормальный подход
а при работе с конкретной платформой, всегда надо знать и учитывать численные характеристики платформы


Знать, учитывать и использовать - совершенно разные вещи. Я к кросс-платформенности отношусь с большим скепсисом. ИМХО нельзя написать по-настоящему хорошее, удобное, оптимизированное кросс-платформенное приложение. В данном же конкретном случае это не к кроссплатформенности относится, а к стилю программирования на C++. К преобразованию типов надо всегда подходить очень ответственно.

Цитата(GoldFinch @  2.4.2009,  09:35 Найти цитируемый пост)
Anikmar, будет выигрыш не только по производительности, но и по безопасности, не надо обеспечивать время жизни указателя на все время жизни потока 

Производительность оставим в покое. А вот по поводу обеспечения времени жизни - все зависит от конкретной задачи. Если создаваемому потоку достаточно парметра int это одно, если надо чего-то больше, то все равно надо обеспечивать необходимое время жизни. И писать в одном случае так, а в другом этак - дело, конечно вкуса, но не мой стиль точно.
ИМХО, однако.

PM MAIL ICQ   Вверх
GoldFinch
Дата 2.4.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Anikmar, да при чем тут асм? я еще когда кодил только на турбопаскале\делфи уже знал сколько байт какая переменная занимает
а вы подозреваю это все никак не можете запомнить вот и говорите про sizeof

sizeof для простых типов данных нужен если вам надо менять строчку
  typedef float MyData;
на
  typedef double MyData;
чтобы не менять везде *4 на *8

а если вы и так знаете сколько байт занимает тип, и не собираетесь менять этот тип на другой, можно смело юзать константу
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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