У меня есть структура C со связанными функциями:
struct StructC {
int a;
int b;
};
static inline StructC func1()
{
StructC ret;
//do something with variables ret.a and ret.b
return ret;
}
static inline void func2(StructC var)
{
//do something with variables var.a and var.b
...
}
и структура C++:
struct StructCPP {
int a;
int b;
StructCPP func3() //can also be static
{
StructCPP ret;
//do something with instance variables ret.a and ret.b
return ret;
}
void func4() //can't use static here since it operates on the instance variables
{
//do something with instance variables a and b
...
}
};
Мой вопрос: что быстрее при передаче этих структур в функции/методы?
Поскольку функции C, действующие на StructC, являются статическими, в памяти только один экземпляр, но что происходит с методами C++ в его структуре?
Выполнять его методы (func3() и func4()) занимают избыточную память для каждого экземпляра или компилятор C++ оптимизирует его для хранения только одного экземпляра, поэтому, передавая структуру C++, только переменные экземпляра a и b, переданы?
функция вызова этих функций выполняется быстрее (если есть какая-либо разница)?:
void functionA(StructC var); //StructC as argument
void functionB(StructCPP var); //StructCPP as argument
(Программа представляет собой смесь C и C++)
Что происходит быстрее при передаче этих структур в функции/методы?
Функция-член должна быть точно такой же быстрой, чтобы вызов как не-член принимал указатель в качестве аргумента; так как это именно то, что есть (не виртуальная, нестатическая) функция-член.
Первая функция, не являющаяся членом, вероятно, немного быстрее, чем первый член, поскольку она не принимает скрытый this
параметр. Однако он не получает доступ к объекту, на который он вызвал, поэтому он может быть статическим или не-членом; в этом случае он будет точно так же быстро, как и нечлен.
Второй берет свой скрытый параметр в качестве указателя, поэтому он может быть медленнее или быстрее, чем функция нечлена, принимающая значение, в зависимости от того, что именно с ней происходит.
Поскольку C-структуры являются статическими, в памяти только один экземпляр, но что происходит с структурами C++?
Структуры C не являются статическими. Вы можете создавать и уничтожать их так же, как и любой другой объект - как ваш пример, когда он создает локальную переменную, а затем возвращает ее копию. C++ классы одинаковы в этом отношении.
Выполнять его методы (func3() и func4()) занимают избыточную память для каждого экземпляра
Нет, функции-члены не занимают памяти в экземпляре класса. Подобно функциям, не являющимся членами, код существует только в одном месте; единственная реальная разница в том, что функции-члены передаются дополнительным аргументом.
Если класс имеет виртуальные функции, то это (обычно) добавляет к каждому объекту единственный указатель, vptr, а также одну статическую таблицу указателей функций и другую информацию типа времени выполнения (vtable) для класса.
при передаче структуры C++ передаются только переменные экземпляра a и b?
В самом деле. Это стандартный класс макета, который означает, что единственное, что он содержит, это его члены данных, как и структура C.
какая функция вызывает эти функции быстрее (если есть какая-либо разница)?
Они должны быть одинаковыми; оба передают тривиально скопируемый объект, содержащий одни и те же элементы данных, по значению.
Код для методов в C++ class
или struct
(это точно так же, ) включается только один раз в исполняемый файл и присутствует только один раз в памяти. Неважно, сколько объектов вы создаете или сколько раз вы их называете¹.
Единственная разница между методом и свободной функцией заключается в том, что метод получает дополнительный "скрытый" аргумент в форме this
. Поэтому даже переменные экземпляра передаются отдельно.
¹ Объявление методов inline
(или, эквивалентно, определение их внутри определения класса) может привести к тому, что в ваш окончательный исполняемый файл будет включено несколько копий того же кода.Это поведение, в общем, очень специфично для компилятора, и в любом случае это относится и к inline
свободным функциям.
inline
не является гарантией, а только подсказкой компилятору. Честно говоря, я в основном игнорировал кодекс и продолжал отвечать в общем смысле. Я исправлю это.
Единственное, что вы можете сказать наверняка, учитывая спецификации языка, следующее: struct
, class
и union
- это только 3 типа классов в C++, где происходит сходство между struct
и class
.
Для всего остального вы должны профилировать, отлаживать и сравнивать разные реализации и компиляторы, ведь C++
все еще является скомпилированным языком, и не все может быть сказано о данной программе, если вы не скомпилируете его.
struct
в C ++ - это код C++
.