Any decent compiler with return value optimization will compile about the same machine code from the above method declarations so I would use CString B(); because it looks nicer. The second version seems much like "human optimized" code but its not that terrible. From this example what came to my mind is the usual CString ToString(); method. Its easier to use the first declaration because the second always requires you to declare variables on the stack before the call while the first one allows you to write nicer code, for example you can immediately pass the return value of B() to another function call that receives a string.
Another thing you need to know here: Even if there is no return value optimization in your compiler (Visual C++ has it) CString is a reference counted string that means: It is just a "pointer" to the string data so copying it copies only a pointer and increases then decreases a refcount of the string data when the returned temp refcount-pointer object (CString) is deleted.
That presumes that some_string = internal_string is a copy operation and not a reference operation. Is that presumption true or false?
The first hands out an address within B's space while the second does not. That also means that the caller would have to copy it before doing anything that would change it. I know we can adorn the return value with "const", but still.
Is that logic flawed?
Thanks for your time
If you work with telemetry, please check this bulletin board: http://www.bkelly.ws/irig_106/
If you are interested about how optimizations work please use google. You can never expect a compiler to optimize your code at a particular code location but please don't write ugly code just to try to optimize out things prematurely. Whether to make a piece of code manually-optimized and ugly depends on a few factors: The size of the data structure you want to return, the frequency with which the function is being called,... Keep the code pretty and easy to read and optimize/uglify the critical often-executed parts. Optimization takes place periodically during development. While optimizing you find out what part of the code takes most of the execution time and you cut it off here and there. Often these codepieces are found at the most unexpected places and the biggest performance degradations happen due to algorithmic problems.
First of all, you don't need to empty the string before populating it:
<br />void B( CString &some_string ); // (spelling error fixed)<br />
some_string.empty(); // this line is unnecessary<br />
some_string = internal_string;<br />
There are several things that happen in this (fixed) code that don't happen in the 'first call' version. When calling the API, there is more setup on the part of the caller. A CString variable needs to exist already, and API setup makes sure that it is either empty or ref count is zero (and writable). Assuming that internal_string is another CString, no copying takes place. The some_string object's header info is updated to duplicate the same info in internal_string, and the ref count is incremented. If internal_string is 1MB in size, only a pointer and counter are changed (ie. no copying).
Again, if internal_string is a CString, a similar process also happens in your 'first call' code (ie. no copying).
If internal_string is a (const?) char* or (const?) char or something else that looks like one of those, then a copy needs to take place for both versions of the code.
Windows 8 is the resurrected version of Microsoft Bob. The only thing missing is the Fisher-Price logo.
It depends on few things. Most importantly what bussiness logic is there in B.
For example suppose B function is responsible to read data from a very large file and you want to return that from B. There are changes that file open error may occure then:
int B(CString &out_string) will be best option because of two reasons.
1. The error code can be returned as return parameter
2. You dont need to accumulate the content of file in a local variable which gets added and deleted on stack while transferring that as return value.
Microsoft products still make use of these. If you are developing something that is interconnected for example with office products than chances are good that you have to mess with COM as some programming interfaces of these products are exposed with COM. Sometimes interconnection between 2 softwares written in different languages is the easiest via COM if both language compilers have COM support (this is also dependent on the kind of interconnection - its quite rare when a pipe or loopback socket isn't enough). In my opinion if you are developing your own software then the best is to avoid COM if possible. Keep it simple. Use a technology/library only if it makes your job easier or if it is explicitly requested by your client. Don't use something "just because" its a fashion or because it is used by another product. It can be possible that a famous product uses technology X but the architects are cursing the day of choosing that technology and today they simply cant afford (time/$) getting rid of it. Before you start using something do some research and compare different solutions on a simple example program. Investing the time in this pays off in the long run especially in case of a bigger project.
I think that these technologies still using by Microsoft and I think also that they are very important.
but it's not wrong to use a new software builder and coder , they all the same but the new are easier to use.
Iam currently developing window application using VC6 and VC2008 and interested to learn ATL, STL, WTL and COM. I have refered many article and tutorial in the net. But I felt difficult to understand the concepts and explanation. Friends kindly suggest me any material or site which many helpful to learn it from beginning.
Introduction to COM - What It Is and How to Use It.[^] by Michael Dunn, is an excellent introdiuction, as are his other articles on the subject. Scott Meyers has written some useful books on STL which you can probably find on Amazon. I don't use ATL/WTL so cannot offer suggestions for those. However, I would say that if you find these subjects difficult to understand then it is important to focus on only one at a time.
Inside COM by Dale Rogerson (very good intro)
Professional COM Applications with ATL by Sing Li and Panos Economopoulos (more advanced)
COM IDL & Interface Design by Al Major (everything you ever wanted to know about interfaces)
When using jscipt9 (Chakra) from C++ with the AddNamedItem() / GetScriptDispatch() functionality to create a module-like behaviour (context separation) I get E_OUTOFMEMORY from GetScriptDispatch().
This happens only when omitting the SCRIPTITEM_GLOBALMEMBERS flag with AddNamedItem(), no matter what other flags are given.
I tried already everything, including different flags (all possible flags, not only the known ones), changing the order of calls to IActiveScript, calling it in different states of the script engine, invoking different versions via SCRIPTPROP_INVOKEVERSIONING, implementing all requested interfaces in my IActiveScriptSite etc - no result.
For older versions (means: not using jscript9) of jscript everything works as expected. But as soon as I switch the CLSID to Chakra it breaks.
I'm developing a web game, which uses ATL based ActiveX control to display the 3d game world. When the game activex control was loaded by IE, a seperate game thread was created and the game HWND was created in the thread as child window of the activeX window. Then a message loop was running in the thread to process game logic, rendering,..etc.
In the game thread, I created a windowless mode Shockwave Flash player COM interface to display 2D content, which uses OleDraw to render the image to a texture.
Ok, All these things runs fine in IETab on chrome, BUT not in the IE! The flash player displays nothing in IE! In fact, some web browser which used IE core does work correctly, except IE!
So what could be the reason, and how can I fix this problem?