There are different reasons people would want to do different ways, but yes, you’re right that there are just a thousand ways to skin a cat.
Look at it like this, if you’re doing this every tick:
FString ChairPosition = GetOwner()->GetActorLocation().ToString();
UE_LOG(LogTemp, Warning, TEXT("Chair is at: %s"), *ChairPosition);
Then every cycle, your game is taking the time to declare a variable, run the function, print the statement and pull the value from memory…
Whereas if you’re doing this:
UE_LOG(LogTemp, Warning, TEXT("Chair is at: %s"), *GetOwner()->GetActorLocation().ToString());
Every cycle, you’re printing the statement and running the function, without the extra reserving and calling from memory.
Now, to be fair, you’re saving tiny fractions of a second each time you do this. Milliseconds, probably. But, the larger the datatype, I would have to assume the more you’re saving. The more methods going on in your scene, the more impact those choices would have, I would have to imagine.
HOWEVER… The downside to that is, you’re going to have to get used to seeing more “cryptic” code, which is a bit of a hassle for newer people, and makes coming back after time away a bit more difficult. It’s a bit easier to understand what a variable called “ChairPosition” is after 3 months away than calling a method on a returned value from a function call from a dereferenced pointer value. lol