Почему в Unreal Engine конструкторы C++ структуры помечают с FORCEINLINE?
Почему, при создании 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();
}