I don't think there's much, if any, efficiency difference. The main upside to cin and cout is that they're type-safe and extensible. That is, with printf, if you try to print a character with "%s", you'll get strange results, and there's no way to define a format specifier for types you've created. C++-style streams get around both of those problems; a char will print as a char unless you explicitly tell it to print as something else. You can easily define operators to work with C++ streams and any type you define.