
"Ion GaztaƱaga" <igaztanaga@gmail.com> skrev i meddelandet news:4409CCA4.6050107@gmail.com...
Hi to all,
While revising a bit the boost::filesystem error/exception use for looking a model for interprocess library and after reading the N1934 "Filesystem Library Proposal for TR2 (Revision 2)" I'm a bit concerned about the heavy use of std::string/string_type in the library.
The following functions return some kind of path as value type:
// observers const string_type string() const; const string_type file_string() const; const string_type directory_string() const;
const external_string_type external_file_string() const; const external_string_type external_directory_string() const;
string_type root_name() const; string_type root_directory() const; basic_path root_path() const; basic_path relative_path() const; string_type leaf() const; basic_path branch_path() const;
I know that syntactically this is nicer and we can have RVO:
string_type str = path.string();
But when iterating through directories I find that that returning a temporary object that must allocate/copy/deallocate hurts my performance paranoia. Even with move semantics we have a an overhead:
On the other hand, I would guess that the actual OS and hard drive / network level operations take a lot more time than copying a few strings.
std::vector<std::path> paths; //fill with paths
std::path::iterator beg = paths.begin(), end = paths.end();
for(; beg != end; ++it){ std::path::string_type str = it->root_name();//temporary created str += "append some data"; std::cout << str; }
or std::cout << it->root_name() << "append some data"; Who says you want to store the result? A temporary might be just fine.
Couldn't be better (although uglier) to take a reference to a string that will be filled?
void fill_root_name(string_type &root_name) const;
Really ugly! :-) It also assumes that the caller has somewhere to store the result. And the intention to keep it.
...
////////////////////////////////////////////////////////////////////
std::vector<std::path> paths; //fill with paths
std::path::string_type root_name;
root_name.reserve(PATH_LENGTH);
So now you are wasting space instead. :-)
This way we only allocate memory if we don't have enough place in our string. We can also reserve it beforehand to speed up code.
How do we know that speed is gained (and important), while space is cheaper? Bo Persson