1

我想在遗留 C API 之上针对现代格式库(特别是 libfmt)测量 vsnprintf 的性能。不能直接在调用者处使用 C++。我怎样才能做到这一点?

const char *fmt, ...

我们得到的参数并不意外地是一个格式字符串,后跟一个可变参数列表。输出需要以零终止。如果这无法获得最大性能,我将不得不手动实例化每个格式字符串的一个版本。现在我正试图避免这种情况。

目标是具有提供的最大长度的缓冲区。我们不能将堆用于任何事情。没有堆。

4

2 回答 2

3

与 printf 相比,fmt 的工作方式有一个非常根本的区别。也就是说,fmt 的格式化字符串不包含类型信息。

fmt基于 C++ 可变参数模板。预计类型信息将按照 C++ 的典型方式进行传输:通过编译时机制。因此,fmt的格式字符串不需要重复所有格式化函数固有的类型信息。这种强类型允许fmt允许基于类型的可扩展性特性。

C 可变参数擦除所有类型信息。如果没有存储在字符串中的类型信息,就无法恢复fmt 需要完成工作的类型信息。

libfmt 库包含一个dynamic_format_arg_store类型(这不是 C++20 的一部分,但我认为您可以构建它)。但是,即使这要求您知道存储参数时的类型。由于 C 可变参数已经删除了类型,所以你不走运。

作为库的基本假设fmt使其与 C 可变参数不兼容。

于 2020-08-03T17:02:05.637 回答
2

{fmt} 是一个 C++ 库,它不提供 C API,因此您需要使用 C++ 编译器或编写自己的 C 包装器。您可以使用dynamic_format_arg_store在包装器中构建参数列表,但它的效率低于直接使用 C++ API。

于 2020-08-03T16:22:31.940 回答