Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: void main(void) ?  (Прочитано 8012 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Nick
Интересующийся

ru
Offline Offline

« : 16-07-2015 10:57 » 

Скажите а функция с сигнатурой

void main(void){

}

Дает какие-то либо выгоды в плане производительности?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 16-07-2015 11:02 » 

По-моему такой вариант не является допустимым, допустимы варианты:
Код:
int main(void);
int main(int argc, char* argv[]);

void main(void) не возвращает кода завершения, и таким образом в качестве кода завершения вызывающему процессу может передаваться какой-нибудь мусор.
Записан
Nick
Интересующийся

ru
Offline Offline

« Ответ #2 : 16-07-2015 11:15 » 

А у меня компилица и с March=native  и без

Добавлено через 50 секунд:
Или всмысле не рекомендуется?
« Последнее редактирование: 16-07-2015 11:15 от Nick » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 16-07-2015 12:17 » 

Оно может компилироваться как угодно - компилятор, а точнее компоновщик, это никак не проверяет, но по стандарту C11 допустимы только эти два варианта. Что будет, если Вы main() объявите по другому не говорится - может работать, а может, в зависимости от расположения пятен на Солнце, например, форматировать диск.

А почему так нельзя делать, потому-что код системной библиотеки, который вызывает Ваш main(), делает это примерно следующим способом:
Код: (C)
  exit(main(argc, argv));

что примерно соответствует следующему варианту на языке ассемблера (для архитектуры IA-32):
Код: (ASM)
/*вызов основной функции на C*/
        call _main
/*завершение программы*/
        pushl %eax
        call _exit

Как Вы наверное понимаете, при таком вызове, из main()-а ожидают получения кода завершения, который в архитектуре IA-32 (x86) при соглашениях о вызове cdecl возвращается через регистр EAX. Если Вы у себя описали void main(void), то, перед выходом из main()-а, этому регистру не будет присвоение какого-нибудь осмысленного значения, и там будет какое-то совершенно случайное значение.

Соответственно и вызов exit() сообщит системе это случайное значение. Далее, программа, которая вызвала Вашу программу через системные вызовы fork()+exec(), через системный вызов wait()/waitpid() получит такой случайный код завершения, и не сможет определить правильно-ли отработала Ваша программа или нет.
« Последнее редактирование: 16-07-2015 12:25 от darkelf » Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 16-07-2015 15:16 » 

Дает какие-то либо выгоды в плане производительности?
Никаких, оформление главной функции в программе не оказывает влияние на быстродействие кода внутри этой главной функции. К слову сказать, самое сильное влияние на скорость выполнения оказывает правильный выбор алгоритма для выполнение поставленной задачи. Например, какой-нибудь интеграл можно решать методом итераций, при этом на его вычисление будут тратится миллионы тактов, однако, можно его решить или значительно упростить, применив математические познания. В итоге, он примет форму какого-нибудь: y = (x + 2) /x, и будет решаться уже в пределах сотен тактов - выигрыш в скорости сразу на пять порядков! Таким образом, делать упор на оптимизации по скорости имеет смысл на последней стадии, когда выбран оптимальный алгоритм и программа написана грамотно, но её скорость, по прежнему, недостаточна.
Записан
Nick
Интересующийся

ru
Offline Offline

« Ответ #5 : 20-07-2015 14:58 » new

Всем, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines