Причина, по которой я использую спецификатор функции inline
(в частности, static inline
), заключается не в «скорости», а в том, что часть
static
сообщает компилятору функция видна только в текущем блоке перевода (текущий файл компилируется и включает заголовочные файлы). Часть
inline
сообщает компилятору, что она может включать реализацию функции при вызове. site, если он хочет, чтобы
static inline
сообщали компилятору, что он может полностью пропустить функцию, если она вообще не используется в текущем модуле перевода
( В частности, компилятор, который я использую чаще всего с опциями, которые я использую чаще всего, gcc -Wall
, выдает предупреждение, если функция, помеченная static
, не используется, но не выдает предупреждение, если функция, помеченная static inline
, не используется.)
static inline
говорит нам, что эта функция является вспомогательной функцией, подобной макросу, и, кроме того, добавляет проверку типа в то же поведение, что и макрос.
Таким образом, на мой взгляд, предположение, что inline
имеет какое-либо отношение к скорости как таковое, неверно. Ответ на поставленный вопрос прямым ответом будет вводить в заблуждение.
В моем коде вы видите их связанные с некоторыми структурами данных или иногда с глобальными переменными.
Типичным примером является случай, когда я хочу реализовать генератор псевдослучайных чисел Xorshift в своем собственном коде C:
#include
static uint64_t prng_state = 1; /* Any nonzero uint64_t seed is okay */
static inline uint64_t prng_u64(void)
{
uint64_t state;
state = prng_state;
state ^= state >> 12;
state ^= state << 25;
state ^= state >> 27;
prng_state = state;
return state * UINT64_C(2685821657736338717);
}
static uint64_t prng_state = 1;
означает, что prng_state
является переменной типа uint64_t
, видимый только в текущем модуле компиляции и инициализированный значением 1. Функция prng_u64()
возвращает беззнаковое 64-битное псевдослучайное целое число. Однако, если вы не используете prng_u64()
, компилятор также не будет генерировать для него код.
Другой типичный случай использования - когда у меня есть структуры данных, и им нужны функции доступа. Например,
#ifndef GRID_H
#define GRID_H
#include
typedef struct {
int rows;
int cols;
unsigned char *cell;
} grid;
#define GRID_INIT { 0, 0, NULL }
#define GRID_OUTSIDE -1
static inline int grid_get(grid *const g, const int row, const int col)
{
if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
return GRID_OUTSIDE;
return g->cell[row * (size_t)(g->cols) + col];
}
static inline int grid_set(grid *const g, const int row, const int col,
const unsigned char value)
{
if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
return GRID_OUTSIDE;
return g->cell[row * (size_t)(g->cols) + col] = value;
}
static inline void grid_init(grid *g)
{
g->rows = 0;
g->cols = 0;
g->cell = NULL;
}
static inline void grid_free(grid *g)
{
free(g->cell);
g->rows = 0;
g->cols = 0;
g->cell = NULL;
}
int grid_create(grid *g, const int rows, const int cols,
const unsigned char initial_value);
int grid_load(grid *g, FILE *handle);
int grid_save(grid *g, FILE *handle);
#endif /* GRID_H */
Этот заголовочный файл определяет некоторые полезные вспомогательные функции и объявляет функции grid_create()
, grid_load()
и grid_save()
, которые будут реализованы в отдельном файле .c. [ 1140]
(Да, эти три функции можно было бы также реализовать в заголовочном файле, но это сделало бы заголовочный файл довольно большим. Если у вас был большой проект, распределите его по множеству единиц перевода (. c исходные файлы), каждый из которых включает в себя файл заголовка, получит свои собственные локальные копии функций. Функции доступа, определенные как static inline
выше, являются короткими и тривиальными, поэтому вполне нормально, что они будут скопированы здесь и там. три функции, которые я пропустил, намного больше.)
Обычно проблема со свойством DefaultFile, являющимся пустым. Файл данных по умолчанию - то, где файлы данных хранятся на экземпляре SQL Server, если иначе не указано в свойстве FileName. Если никакое другое местоположение по умолчанию не было указано, свойство возвратит пустую строку.
Так, это свойство ничего не возвращает (пустая строка), если Вы не установили местоположение по умолчанию.
Обходное решение должно проверить свойство DefaultFile, если оно возвращает использование пустой строки, SMO для получения основной базы данных затем используют Базу данных. Свойство PrimaryFilePath для получения Местоположения Файла данных По умолчанию (так как это не изменилось),
Так как Вы говорите, что проблема с Вашим PrimaryFilePath:
Server srv = new Server(connection); DatabaseCollection dbc = svr.Databases; Database database = dbc["dbName"]; string filePath = database.PrimaryFilePath;
Вот как я это делаю, подготовленный для нескольких имен файлов. Обратитесь к database.LogFiles, чтобы получить тот же список имен файлов журнала:
private static IList<string> _GetAttachedFileNames(Database database)
{
var fileNames = new List<string>();
foreach (FileGroup group in database.FileGroups)
foreach (DataFile file in group.Files)
fileNames.Add(file.FileName);
return fileNames;
}