Slashdot Mirror


Tools for Analyzing C++ Class Code Generation?

Milo_Mindbender submits this query: "I've got a midsize Linux project which uses a lot of STL and other C++ template code. Even considering this, I end up with a lot bigger text (generated code) segment than expected. I know the information about the amount of code generated for each class is in the objdump, but prying it out by hand is a problem when you get five line long template invocations and hundreds of methods to wade through. Can anyone can recommend some tools that analyze binary or objdump output and summarize the amount of code generated for each class, including each unique template or STL class?"

6 of 48 comments (clear)

  1. Uhhh, perl or python? by ComputerSlicer23 · · Score: 3, Interesting
    Uhhh, use your favorite scripting language. Doing the demangle might be a bit tricky, but nm or obj dump should do either of those for you. Then just parse the class names.

    Use a map or a hash. Oh, and lastly, move all the code in headers out into the .cxx/.cpp file, your code will compile faster, and probably run nearly as fast, with the exception of a handful of performance critical classes (finding them is important).

    Kirby

  2. OpenC++ by angel'o'sphere · · Score: 4, Interesting

    Search at source forge for Open C++ or OpenCPP, not sure how it is written.

    That is a programmable source to source transformer for C++.

    It spits out one singel file of c++ for every compiled C++ unit, removing the includes, by expanding them into the output.

    That way yo can source level debug the processed c++ code, not exactly what you want but likely more powerfull in the long run anyway.

    Your request varies far to heavy from compiler to compiler.

    angel'o'sphere

    --
    Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
  3. Turn off inlining by Anonymous Coward · · Score: 2, Interesting

    This is more of a suggestion than a debugging tool but...

    You didn't say which compiler you were using but, for example, with a recent g++, try turning off some of the inlining and turn on -frepo. This will make sure that, for example, there is only ever one copy of map::find.

    I don't know; maybe the latest g++ does a good job of this already.

  4. Re:Reducing template bloat by saurik · · Score: 4, Interesting

    If your data type really can be static_cast'd to a void * then there's probably a much better solution to this problem in almost 90% of the cases: it's called a "better compiler". I don't know what compiler you are using, but Visual Studio .NET finds functions whose assembly code generated the same and merges them (or whatever you want to call it: links all usages to the same implementation) at link time.

    So if you have a vector of int * and a vector of long * and a vector of MyObject * and a vector of unsigned long they should all generate the same assembly code and you should only end up with a single set of these in your resulting binary.

  5. Re:Reducing template bloat by Daleks · · Score: 2, Interesting
    I think you mean
    T get(size_t i)
    {
    return *static_cast<T*>(vec[i]);
    }

    void insert(T item)
    {
    vec.push_back(static_cast<void*>(new T(item)));
    }
    You also need a destructor that walks the vector and calls delete() on each pointer-to-void.
  6. Re:STL: that bad? by bmac · · Score: 3, Interesting

    Yup, STL is *partly* responsible for C++ being mostly worthless, but let's not forget the other big nail in C++'s coffin: multiple-inheritance. The ol' diamond of death means compiler-determined (and not in any kind of spec, that I know of, tho I may be wrong) implementation, which is an auto-no-go in my book. Then again, I've *never* seen a practical reason to use multiple inheritance. Most books just use some assinine example like animals, mammals, and cows. WTF?! I use C because it's deterministic, and the implementation offers no surprises, except for bugs in the linked libs, of course :-)

    Even in C# (which I use for rad development as a transition to straight C + win32/bsd), the Hashtable collection is totally fscked. After a certain number of elements it just goes to the weeds. Totally ridiculous. Some of the bugs in the *$2000* .NET IDE are so absurd that you wonder if Micro$oft isn't try to screw developers from being able to write sophisticated programs at all.

    Oh well, crappy software means I still have an market :-)

    Peace & Blessings,
    bmac