Экстерн и статические указатели в C

Компиляция для определенной оптимизации ЦП обычно переоценивается. Просто возьмите программу в C++ и скомпилируйте с оптимизацией для Pentium Pro и работайте на pentium 4. Затем перекомпилируйте с, оптимизируют для pentium 4. Я передал долгие дни, делая его с несколькими программами. Общие результаты?? Обычно меньше чем 2-3%-е увеличение производительности. Таким образом, теоретические преимущества JIT не почти ни один. Большинство различий производительности может только наблюдаться при использовании скалярных функций обработки данных, что-то, чему в конечном счете будет нужна ручная прекрасная настройка для достижения максимальной производительности так или иначе. Оптимизация того вида является медленной и дорогостоящей для выполнения создания их иногда неподходящий для JIT так или иначе.

На реальном мире и реальном приложении C++ все еще обычно быстрее, чем Java, главным образом из-за более легкого объема потребляемой памяти, которые приводят к лучшей производительности кэша.

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

7
задан Skurmedel 17 August 2009 в 07:19
поделиться

5 ответов

Чтобы ответить на ваш вопрос о том, когда их можно использовать, приведу пару простых примеров:

Статический указатель может использоваться для реализации функции, которая всегда возвращает программе один и тот же буфер, выделяя его при первом вызове:

char * GetBuffer() {
   static char * buff = 0;
   if ( buff == 0 ) {
       buff = malloc( BUFSIZE );
   }
   return buff;
}

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

extern int ArgC = 0;
extern char ** ArgV = 0;

int main( int argc, char ** argv ) {
   ArgC = argc;
   ArgV = argv;
   ...
}
12
ответ дан 6 December 2019 в 06:37
поделиться

Краткий ответ: их не существует. C99 6.7.1 говорит: «В спецификаторах объявления в объявлении может быть указано не более одного спецификатора класса хранения». extern и static являются спецификаторами класса хранения.

8
ответ дан 6 December 2019 в 06:37
поделиться

См. Как правильно использовать ключевое слово extern в C

И Внутренние статические переменные в C, вы бы использовали их?

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

2
ответ дан 6 December 2019 в 06:37
поделиться

Предположим, у меня есть указатель, который я хочу сделать глобально доступным для нескольких единиц перевода. Я хочу определить его в одном месте (foo.c), но разрешить несколько объявлений для него в других единицах перевода. Ключевое слово extern сообщает компилятору, что это не определяющее объявление для объекта; фактическое определение появится в другом месте. Он просто делает имя объекта доступным для компоновщика. Когда код компилируется и связывается, все различные единицы перевода будут ссылаться на один и тот же объект с этим именем.

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

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

/** 
 * foo.h
 */
#ifndef FOO_H
#define FOO_H

/**
 * Non-defining declaration of aGlobalPointer; makes the name available
 * to other translation units, but does not allocate the pointer object
 * itself.
 */
extern int *aGlobalPointer;

/**
 * A function that uses all three pointers (extern on a function 
 * declaration serves roughly the same purpose as on a variable declaration)
 */
extern void demoPointers(void);
...
#endif

/**
 * foo.c
 */
#include "foo.h"

/**
 * Defining declaration for aGlobalPointer.  Since the declaration 
 * appears at file scope (outside of any function) it will have static 
 * extent (memory for it will be allocated at program start and released 
 * at program end), and the name will be exported to the linker.
 */
int *aGlobalPointer;

/**
 * Defining declaration for aLocalPointer.  Like aGlobalPointer, it has 
 * static extent, but the presence of the "static" keyword prevents 
 * the name from being exported to the linker.  
 */
static int *aLocalPointer;

void demoPointers(void)
{
  /**
   * The static keyword indicates that aReallyLocalPointer has static extent, 
   * so the memory for it will not be released when the function exits,
   * even though it is not accessible outside of this function definition
   * (at least not by name)
   */
  static int *aReallyLocalPointer;
}
3
ответ дан 6 December 2019 в 06:37
поделиться

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

Extern означает, что он объявлен глобально, но в другом файле. (в основном это означает, что эта переменная действительно существует, и это то, что она определяется как).

2
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: