dblaikie added a comment. (still lots of outstanding comments from my last round, so I won't reiterate those - but waiting for some responses to them)
================ Comment at: llvm/lib/Support/Compression.cpp:30-32 +ZStdCompressionAlgorithm + *llvm::compression::ZStdCompressionAlgorithm::Instance = + new ZStdCompressionAlgorithm(); ---------------- ckissane wrote: > dblaikie wrote: > > leonardchan wrote: > > > Perhaps for each of these, you could instead have something like: > > > > > > ``` > > > ZStdCompressionAlgorithm *getZStdCompressionAlgorithm() { > > > static ZStdCompressionAlgorithm* instance = new > > > ZStdCompressionAlgorithm; > > > return instance; > > > } > > > ``` > > > > > > This way the instances are only new'd when they're actually used. > > Yep, I'd mentioned/suggested that (so, seconding here) elsewhere > > encouraging these to be singletons: https://reviews.llvm.org/D130516#3683384 > > > > And they don't even need to be 'new'd in that case, this would be fine: > > ``` > > ZstdCompressionAlgorithm &getZstdCompressionAlgorithm() { > > static ZstdCompressionAlgorithm C; > > return C; > > } > > ``` > > > > Though I think maybe we don't need individual access to the algorithms, and > > it'd be fine to have only a single entry point like this: > > ``` > > CompressionAlgorithm *getCompressionAlgorithm(DebugCompressionType T) { > > switch (T) { > > case DebugCompressionType::ZStd: { > > static zstd::CompressionAlgorithm Zstd; > > if (zstd::isAvailable()) > > return &Zstd; > > } > > ... > > } > > return nullptr; > > } > > ``` > > (or, possibly, we want to return non-null even if it isn't available, if we > > include other things (like the configure macro name - so callers can use > > that name to print helpful error messages - but then they have to > > explicitly check if the algorithm is available after the call)) > they currently already have singleton behavior i.e. > `llvm::compression::ZStdCompressionAlgorithm::Instance` is the only place > `new ZStdCompressionAlgorithm()` can be put into because the constructor is > protected. > > I'd rather not achieve "This way the instances are only new'd when they're > actually used." > Because the rewards of that are relatively small, but it will make the code > more verbose, I think the current pattern allows the best of both worlds of > the namespace approach: > (`llvm::compression::zlib::compress` becomes > `llvm::compression::ZlibCompression->compress`) > but they can be passed as class instances. Global constructors are to be avoided in LLVM: https://llvm.org/docs/CodingStandards.html#do-not-use-static-constructors (also these objects don't need to be dynamically allocated with `new` - they can be directly allocated (as static locals though, not as globals)) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130516/new/ https://reviews.llvm.org/D130516 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits