Background is simply that ZeroMemory is a Windows API call.
RtlZeroMemory is a Windows function. ZeroMemory is a macro.
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)
As is rather usual, MS doesn't tell the whole story.
RtlZeroMemory is a function implemented in NTDLL, it's (32bit) code is:
.text:77062890 ; Exported entry 1304. RtlZeroMemory
.text:77062890
.text:77062890 ; =============== S U B R O U T I N E =======================================
.text:77062890
.text:77062890
.text:77062890 ; __stdcall RtlZeroMemory(x, x)
.text:77062890 public _RtlZeroMemory@8
.text:77062890 _RtlZeroMemory@8 proc near ; DATA XREF: .text:off_77020210↑o
.text:77062890
.text:77062890 arg_0 = dword ptr 4
.text:77062890 arg_4 = dword ptr 8
.text:77062890
.text:77062890 push edi
.text:77062891 mov edi, [esp+4+arg_0]
.text:77062895 mov ecx, [esp+4+arg_4]
.text:77062899 xor eax, eax
.text:7706289B cld
.text:7706289C mov edx, ecx
.text:7706289E and edx, 3
.text:770628A1 shr ecx, 2
.text:770628A4 rep stosd
.text:770628A6 or ecx, edx
.text:770628A8 jnz short loc_770628AE
.text:770628AA pop edi
.text:770628AB retn 8
.text:770628AE ; ---------------------------------------------------------------------------
.text:770628AE
.text:770628AE loc_770628AE: ; CODE XREF: RtlZeroMemory(x,x)+18↑j
.text:770628AE rep stosb
.text:770628B0 pop edi
.text:770628B1 retn 8
.text:770628B1 _RtlZeroMemory@8 endp
One nice thing about it is that it tries to minimize the number of moves.
Since it is a C macro, in FPC it is implemented as a function.
It often is a macro that is a synonym of an inline implementation of memset. BTW, it is definitely not a C macro when programming in Assembler. In assembler it resolves to the ntdll function.
On Windows it is marked legacy and now has as alternative SecureZeroMemory.
It is questionable that the Secure version is more secure. In both cases, sizeof is going to be used. The "security" comes from the occasionally undesirable behavior from the C compiler. IOW, as genuine functions (not macros), they are both as secure or insecure however you want to look at it.
In FreePascal we don't need that.
It's very useful in FPC, in C and in assembler.
FPC generates inline versions, e.g, character arrays and structures initialized with Default() but Default is simply too inconvenient to be used.
The inline capability is nice but, it can definitely grow the size of the executable (not that anyone who's using the LCL would ever notice.)