What are the differences between library call back functions and WolframCompileLibrary macros?

I'm trying to use LibraryLink in Mathematica, and come across some problems.

Consider if we have a MTensor m1 which contains a one dimensional double array, and I want to get the data of that array. I come across two methods. One is to use library callback functions libData->MTensor_getRealData(m1) as shown here , the other is use the micros MTensor_getRealDataMacro(m1) in the WolframCompileLibrary.h file as shown here.

What are the differences between them? Does the library call back functions are slower then the macro since they need to "call back" to Mathematica?

-

Does the library call back functions are slower then the macro since they need to "call back" to Mathematica?

I'm pretty sure this is not the case. I guess that the difference is really that the WolframLibrary.h is a public interface which hides all implementation, while the WolframCompileLibrary.h is used by the CCodeGenerator and gives you at least some insight.

That being said, while you find the full declaration of the MTensor struct in the WolframCompileLibrary.h

struct M_TENSOR_STRUCT
{
void *data;
TensorProperty properties;
mint flattened_length;
};


this is not exposed in the WolframLinkLibrary.h.

The biggest indicator that you should only use the WolframLibrary is that there is no documentation about the CompileLibrary at all. You only learn about their functionality when you look on the code of functions like CCodeStringGenerate.

Does the library call back functions are slower then the macro since they need to "call back" to Mathematica?

I guess you mean, slower because it uses MathLink to talk to the kernel? No, I'm pretty sure this doesn't happen, because exactly this is the advantage and disadvantage of the WolframLibrary. An advantage, because you have direct C-level access on the internal data of the kernel, like an MTensor. Disadvantage, because when you screw up, you crash the kernel. No layer of communication between you and the fragile data of the kernel.

By the way

if you want, you can easily do benchmarks by yourself. The code for showing that both, the WolframLibrary and the CompileLibrary point to the same data buffer when you extract it from an MTensor is as short as

#include <stdio.h>
#include "WolframRTL.h"

DLLEXPORT int tensor(WolframLibraryData libData, mint Argc,
MArgument *Args, MArgument Res) {
char buffer[1024];
MTensor T0;
mint *I0, *I1;
T0 = MArgument_getMTensor(Args[0]);
I0 = libData->MTensor_getIntegerData(T0);
I1 = (mint*) (T0->data);
snprintf(buffer, sizeof(buffer), "MTensor_getIntegerData: %p, T0->data %p",I0, I1);
MArgument_setUTF8String(Res, buffer);
return LIBRARY_NO_ERROR;
}


Creating a library from that and calling the function with an integer list gives

And before you ask (mint*) (T0->data) is the macro expansion of getIntegerDataMacro`.