Производительность C struct против C ++ struct / class

0

У меня есть структура 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++)

  • 5
    Если я не ошибаюсь, я считаю, что структуры интерпретируются как классы в C ++.
  • 0
    Вы передаете объекты , а не структуры . Методы, связанные со структурой, не копируются. Если это то, что вы спрашиваете.
Показать ещё 5 комментариев
Теги:
class
struct

3 ответа

3
Лучший ответ

Что происходит быстрее при передаче этих структур в функции/методы?

Функция-член должна быть точно такой же быстрой, чтобы вызов как не-член принимал указатель в качестве аргумента; так как это именно то, что есть (не виртуальная, нестатическая) функция-член.

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

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

Поскольку C-структуры являются статическими, в памяти только один экземпляр, но что происходит с структурами C++?

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

Выполнять его методы (func3() и func4()) занимают избыточную память для каждого экземпляра

Нет, функции-члены не занимают памяти в экземпляре класса. Подобно функциям, не являющимся членами, код существует только в одном месте; единственная реальная разница в том, что функции-члены передаются дополнительным аргументом.

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

при передаче структуры C++ передаются только переменные экземпляра a и b?

В самом деле. Это стандартный класс макета, который означает, что единственное, что он содержит, это его члены данных, как и структура C.

какая функция вызывает эти функции быстрее (если есть какая-либо разница)?

Они должны быть одинаковыми; оба передают тривиально скопируемый объект, содержащий одни и те же элементы данных, по значению.

  • 0
    Я объявил структуры C как статические. Я изменил свой вопрос, чтобы отразить мое первоначальное намерение.
  • 0
    @ Alterecho: Нет, вы объявили функции как статические. В вашем примере есть два нестатических объекта типа struct. (И я обновил первый абзац, чтобы учесть ваши изменения).
Показать ещё 3 комментария
2

Код для методов в C++ class или struct (это точно так же, ) включается только один раз в исполняемый файл и присутствует только один раз в памяти. Неважно, сколько объектов вы создаете или сколько раз вы их называете¹.

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


¹ Объявление методов inline (или, эквивалентно, определение их внутри определения класса) может привести к тому, что в ваш окончательный исполняемый файл будет включено несколько копий того же кода.Это поведение, в общем, очень специфично для компилятора, и в любом случае это относится и к inline свободным функциям.

  • 0
    А также обратите внимание на приведенный выше пример: если элемент func3 является статическим, он не должен даже иметь эти дополнительные параметры и, таким образом, абсолютно не влияет на производительность.
  • 0
    @ComicSansMS: правда, хотя inline не является гарантией, а только подсказкой компилятору. Честно говоря, я в основном игнорировал кодекс и продолжал отвечать в общем смысле. Я исправлю это.
Показать ещё 2 комментария
0

Единственное, что вы можете сказать наверняка, учитывая спецификации языка, следующее: struct, class и union - это только 3 типа классов в C++, где происходит сходство между struct и class.

Для всего остального вы должны профилировать, отлаживать и сравнивать разные реализации и компиляторы, ведь C++ все еще является скомпилированным языком, и не все может быть сказано о данной программе, если вы не скомпилируете его.

  • 0
    StructC, в моем случае, является структурой C (также используется в коде C).
  • 0
    @ Alterecho почему? в чем разница со структурой c ++ ? Разницы нет, такая же struct в C ++ - это код C++ .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню