Почему в Unreal Engine конструкторы C++ структуры помечают с FORCEINLINE?

Рейтинг: 1Ответов: 0Опубликовано: 25.02.2023

Почему, при создании C++ структуры (с USTRUCT) - все её конструкторы помечают с FORCEINLINE? Как я понял, FORCEINLINE принудительно заставляет выполнять реализацию конструктора в тех участках кода, где он вызывается без вызова самого конструктора, увеличивая тем самым скорость и объём программы. Но для чего это принудительно делается в Unreal Engine? Только для этого или есть ещё причины?

Пример кода с удачной компиляцией (Point.h):

#pragma once
#include "Point.generated.h"

USTRUCT(Blueprintable)
struct FPoint
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)
    int x;

    UPROPERTY(EditAnywhere)
    int y;

    FORCEINLINE FPoint();
};

FORCEINLINE FPoint::FPoint()
{
    x = 0;
    y = 0;
}

Пример кода с неудачной компиляцией (Point.h):

#pragma once
#include "Point.generated.h"

USTRUCT(Blueprintable)
struct FPoint
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)
    int x;

    UPROPERTY(EditAnywhere)
    int y;

    FPoint();
};

FPoint::FPoint()
{
    x = 0;
    y = 0;
}

Список ошибок от VS 2019:

Серьезность Код Описание    Проект  Файл    Строка  Состояние подавления
Ошибка  MSB3073 выход из команды ""C:\Program Files\Epic Games\UE_4.27\Engine\Build\BatchFiles\Build.bat" UE_4Editor Win64 Development -Project="C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\UE_4.uproject" -WaitMutex -FromMsBuild" с кодом 6.  UE_4    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.MakeFile.Targets  45  

Предупреждение  LNK4006 "public: __cdecl FPoint::FPoint(void)" (??0FPoint@@QEAA@XZ) уже определен в MyActor.cpp.obj; второе определение пропущено   UE_4    C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\Intermediate\ProjectFiles\MyActor.gen.cpp.obj    1   

Предупреждение  LNK4006 "public: __cdecl FPoint::FPoint(void)" (??0FPoint@@QEAA@XZ) уже определен в MyActor.cpp.obj; второе определение пропущено   UE_4    C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\Intermediate\ProjectFiles\Point.gen.cpp.obj  1   

Ошибка  LNK2005 "public: __cdecl FPoint::FPoint(void)" (??0FPoint@@QEAA@XZ) уже определен в MyActor.cpp.obj UE_4    C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\Intermediate\ProjectFiles\MyActor.gen.cpp.obj    1   

Ошибка  LNK2005 "public: __cdecl FPoint::FPoint(void)" (??0FPoint@@QEAA@XZ) уже определен в MyActor.cpp.obj UE_4    C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\Intermediate\ProjectFiles\Point.gen.cpp.obj  1   

Ошибка  LNK1169 обнаружен многократно определенный символ - один или более  UE_4    C:\Users\Micro\Desktop\Project\Temp\Tests\UE_4\Binaries\Win64\UE4Editor-UE_4-0018.dll   1   

Примечание: Ошибка возникает только при подключении заголовка (.h) файла структуры к другому C++ файлу (например, к заголовку C++ класса). В случае, если использовать структуру только в Blueprint (не используя в C++ файлах её вообще), то ошибки не будет при отсутствии FORCEINLINE. В случае, если мне нужно использовать структуру в C++ классах, то без FORCEINLINE проект отказывается компилироваться.


Содержание файла MyActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Point.h"
#include "MyActor.generated.h"

UCLASS()
class UE_4_API AMyActor : public AActor
{
    GENERATED_BODY()

public: 
    AMyActor();

protected:
    virtual void BeginPlay() override;
};

Содержание файла MyActor.cpp

#include "MyActor.h"

AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = false;
}

void AMyActor::BeginPlay()
{
    Super::BeginPlay();
}

Ответы

Ответов пока нет.