Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
LighterV
4 / 4 / 0
Регистрация: 08.08.2013
Сообщений: 48
#1

Почему в файле все функции объявлены как static? - C++

22.07.2014, 11:46. Просмотров 914. Ответов 22
Метки нет (Все метки)

Привет!
В исходном коде Android я нашёл один файл нативного кода на C/C++. Все функции помечены как static и располагаются в одном файле, который больше 9000 строк кода.
Не понимаю, почему не разбить этот файл на несколько, чтобы удобнее было читать. Есть какое-нибудь обоснование этому? Может быть static функции выполняются быстрее или что-нибудь ещё?
https://android.googlesource.com/pla...tiveCrypto.cpp
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 11:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему в файле все функции объявлены как static? (C++):

Нужно ли функции с оператором глобального разрешения ставить сразу за классом,в котором объявлены? - C++
Добрый день! Подскажите, пожалуйста, обязательно ли функция или конструктор от определённого класса и вынесенные за пределы класса, с...

[C/C++]Не могу объявить static функцию в header файле. - C++
Прочитал про static,и пытаюсь сделать функцию доступной только в пределах одного модуля.Поскольку функции вызывают друг друга(и ещё не...

Почему пропускает все функции?! - C++
Почему пропускает все функции?!! Написала без функций, то же самое Подскажите в чем проблема #include <iostream> using namespace...

Может ли быть метод virtual static? И почему? - C++
Очень нужно объяснение! В интернете ничего конкретно про это не написано.

Почему переменная объявленная static работает не корректно? - C++
Переменная j=25 я её обозначил как static int j; и присвоил число 25. Значит эта переменная должна сохраняться и при выходе из функции....

определение функции в ЗАГОЛОВОЧНОМ файле. В основном предполагается переопределение ТЕЛА этой функции. Как это сделать, не правя хидер? - C++
Сабж, а подробнее если в заголовочном файле hider.h описана функция, допустим так: void f (); void f () { int per= 10; } ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
22.07.2014, 14:17     Почему в файле все функции объявлены как static?
  #16

Не по теме:

HighPredator, я имею в виду упомянутую ситуацию относительно применения в шаблоне.

0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 3
22.07.2014, 14:34 #17
Tulosba, а, это что-то вроде такого:
C++
1
2
3
4
5
6
7
8
template <class T> class X { /* ... */ };
void f()
{
  struct S { /* ... */ };
 
  X<S> x3;  // error: local type used as template-argument
  X<S*> x4; // error: pointer to local type used as template-argument
}
Это пример из стандарта. Если аппроксимировать данный пример на механику статика, ситуация будет аналогичная.
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 14:37 #18
HighPredator, хм-м ... http://ideone.com/CHROgx
А вот в C++03 действительно ошибка http://ideone.com/YovRDB
0
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
22.07.2014, 18:44 #19
Цитата Сообщение от LighterV Посмотреть сообщение
Есть какое-нибудь обоснование этому? Может быть static функции выполняются быстрее или что-нибудь ещё?
Android - это Linux. В Linux, когда ты линкуешь бинарник, если не предпринять специальных телодвижений, по-умолчанию экспортируются все функции и переменные с внешним связыванием. Пометив нужные только внутри программы (и\или модуля) функции как static, мы банально уменьшаем размер бинарника и избавляемся от потенциальных конфликтов имен при линковке. Особенно это актуально при написании модулей ядра.
В новых GCC появились средства контроля видимости имен, но static до сих пор используют. Переносимость важнее

Это в дополнение к уже сказанному в этой ветке.
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 3
23.07.2014, 08:22 #20
Цитата Сообщение от DrOffset Посмотреть сообщение
В Linux, когда ты линкуешь бинарник, если не предпринять специальных телодвижений, по-умолчанию экспортируются все функции и переменные с внешним связыванием.
Мне казалось в винде тоже так, не?
Цитата Сообщение от DrOffset Посмотреть сообщение
Пометив нужные только внутри программы (и\или модуля) функции как static, мы банально уменьшаем размер бинарника
Можете мысль развить, а то мне что-то не совсем понятно?
0
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
23.07.2014, 19:01 #21
Цитата Сообщение от HighPredator Посмотреть сообщение
Можете мысль развить, а то мне что-то не совсем понятно?
Таблицы экспорта (посмотреть их можно командой nm) занимают место в бинаре. Если имя в таблицу не попадает, то, соответственно, и не занимает место.
Цитата Сообщение от HighPredator Посмотреть сообщение
Мне казалось в винде тоже так, не?
В винде не так. В винде, если, например в *.dll, тебе надо добавить функцию в таблицу экспорта, ты должен ее объявить специально (__declspec(dllexport) и ко.). В линуксе все добавляется по-умолчанию. И еще одна особенность, библиотеки в dll при линковке по-умолчанию требуют удовлетворения всех зависимостей. В linux по-умолчанию для *.so (ключ -shared) можно не указывать вообще никаких зависимостей (для управления этим есть специальный ключ у ld), все будет разрешаться при линковке исполняемого файла. Под зависимостями имеются в виду другие библиотеки, которые требуются для сборки.
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 3
24.07.2014, 08:48 #22
DrOffset, я по ходу немного в танке... Разве есть в исполняемых файлах (не в библиотеках всяких) секция экспорта?

Добавлено через 23 минуты
Вот пример:
main.c:
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include "test.h"
 
int main(void)
{
  TestFunction1(8);
  return 0;
}
test.h:
C
1
2
3
4
5
6
#ifndef _TEST_H_
#define _TEST_H_
 
void TestFucntion1(int a);
 
#endif
test.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include "test.h"
 
static void TestFunction2(int* p_a);
 
void TestFunction1(int a)
{
  TestFunction2(&a);
  printf("%d\n",a);
}
 
static void TestFunction2(int* p_a)
{
  *p_a = 8;
}
Выхлоп nm:
_bsd_init_routine D 4563404648 8
crt0_64.s f -
crt0_data d 4563404372 104
crt0_data d 4563404704 8
__crt0v d 4563404696 8
__crt0v U -
__C_runtime_pstartup B 4563404768 8
d 4563404744 8
__dce_compat_init_routine D 4563404672 8
errno d 4563404736 8
errno U -
exit d 4563404760 8
exit U -
.exit T 4294968872
.exit t 4294968872 40
glink64.s f -
glink64.s f -
.main T 4294968448
main.c f -
__malloc_user_defined_name d 4563404728 8
__malloc_user_defined_name U -
_malloc_user_defined_name D 4563404624 8
__mod_init d 4563404720 8
__mod_init U -
__n_pthreads d 4563404712 8
__n_pthreads U -
_nsl_init_routine D 4563404664 8
printf d 4563404752 8
printf U -
.printf T 4294968832
.printf t 4294968832 40
__pth_init_routine D 4563404640 8
p_xargc D 4563404632 4
p_xargv D 4563404680 8
p_xrc D 4563404692 4
p_xrcfg D 4563404688 4
../../../../../../../src/bos/usr/ccs/lib/libc/__threads_init.c f -
__start D 4563404584 16
.__start T 4294967800
.__start t 4294967800 173
_$STATIC d 4563404480 101
t 4294968064 384
t 4294968448 128
t 4294968576 256
t 4294968912 4
test.c f -
.TestFunction1 T 4294968640
.TestFunction2 t 4294968576
__threads_init D 4563404600 24
.__threads_init T 4294968064
.__threads_init@AF2_1 t 4294968128
TOC d 4563404624
_xti_tli_init_routine D 4563404656 8
Как видно, обе функции там есть.
0
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
24.07.2014, 19:03 #23
Цитата Сообщение от HighPredator Посмотреть сообщение
Разве есть в исполняемых файлах (не в библиотеках всяких) секция экспорта?
Как бы, библиотека - это тоже исполняемый файл. И я говорил преимущественно о библиотеках. Обрати внимание на контекст в предыдущем посте.

Цитата Сообщение от HighPredator Посмотреть сообщение
Выхлоп nm:
Ключи бы показал. С помощью nm можно ведь не только таблицы экспорта выводить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2014, 19:03
Привет! Вот еще темы с ответами:

Ключевое слово static в объявлении функции - C++
Доброго времени суток. У меня возник вопрос по поводу использования слово static в объявлении функции. На сколько мне известно данное...

Массив в функции со static указателем на него - C++
Здрасти, делаю задание на указатели из книги Хортона по Вижуал С++. Задачка: передать в функцию строку и чтобы функция запомнила строку. ...

Использоваение static функции из другого файла - C++
Всем добра! мне дали файл cmd.cpp с функцией: static void matchCommandParameters(int argc, char **argv, int * v, int * u, int *...

Отличие static от объявление переменных ДО функции main - C++
Может быть я не совсем точно выразился в заголовке. Интересует отличие объявление переменных ДО функции main и объявление через static. По...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.07.2014, 19:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru