p7zip API 设计

p7zip API design

这里maxCheckStartPosition被设计成指针有什么原因吗?

此变量用作搜索限制,我看不出有任何理由会在 Open() 期间更改它。

而且我对整个库进行了 grep,但我看不到任何 Archive 获取所有权/更改该变量。

这个设计决定对我来说真的很奇怪。

p7zip_9.20.1/CPP/7zip/Archive/IArchive.h:

STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \

I don't see any reason why it would get changed during Open().

除了看不到任何原因之外,如果确实如此,从合同上讲,这将是未定义的行为。它被标记为 const (并且这样写,它指向的是 const... 而不是指针).

Is there any reason why maxCheckStartPosition is designed to be a pointer here?

不知道具体动机:

  • 作为一个指针允许 NULL 是可选的,同时如果非 NULL 仍然具有完整的 UInt64 范围可用。这避免了需要选择一个 "magic number" 意味着没有 maxCheckStartPosition.

  • 在 32 位体系结构上,指针意味着堆栈上传递的参数中的 32 位与 64 位...可能有更好或更坏的原因.有些人可能试图微优化推送的字节,其他时候可能是另一个奇怪的原因,为什么你正在与之交互的东西只知道如何将指针大小的东西推送到堆栈(类似 FFI 的东西,或者其他东西) ).