|
AFAIK either method should work under certain circumstances.
MSDN says:
The __forceinline keyword instructs the compiler to inline the function without performing any cost/benefit analysis.
If your using VC++ 6.0 you can specify whether inline should occur with:
Project->Settings->C/C++->Category->Optimizations->Inline function expansion
Check your build mode to make sure it's set to Any suitable for both debug and release.
I always use the C++ implicit inline method for trivial functions.
class myClass{
int myInline(){ return 100; }
};
I'm not 100% sure, but I think it's gaurenteed to inline when declared and defined as above and you avoid un-needed inline keywords. Also I tried this a while back and came to this conclusion...You cannot under any circumstance inline a ctor() in debug.
You asked:
"Now the code still does not get inlined. If I move the function definition into the header file, then it is inlined."
So why not do it this way...?
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
Hockey wrote:
I'm not 100% sure, but I think it's gaurenteed to inline when declared and defined as above and you avoid un-needed inline keywords
Actually inlining is never guaranteed unless you use __forceinline which is generally a bad idea. However, in practice VC++ always inlines trivial functions like Hockey illustrated. (I also agree with his suggest to set inlining to "Any Suitable", though I turn off inlining for debug since it can make debugging a real pain.
Incidentally, I'd implement your function as a MACRO.
|
|
|
|
|
can i ask why u have a function call for something so trivial?
just curious
"... and so i said to him ... if it don't dance (or code) and you can't eat it either f**k it or throw it away" biz stuff about me
|
|
|
|
|
Is this not the purpose of inline mutators and accessors...?
Besides it's like using a MACRO with type checking and ZERO penalties. Syntactic sugar I thought...?
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
Because the other way to do this is:
double a = some_complicated_result();
answer = a * a;
The new code is easier i.e.
answer = get_square(some_complicated_result());
A #define can't be used, as this will evaluate the argument twice.
kris
|
|
|
|
|
For the compiler to inline a function it must (obviously) have access to the function definition. Move your get_square function into the header file.
Just for kicks you might also consider making it a template function, to work with any type you can multiply:
template <typename T>
T get_square(T v) { return v * v; }
|
|
|
|
|
I though about doing this, but was unsure of the run time implications.
Are all templates sorted out at compile time? or do the require some run time checking?
|
|
|
|
|
A template is just what its name implies, a template for the compiler to generate code from. As such, the code is generated at compile time and there is no runtime overhead.
|
|
|
|
|
I have a Dialog Applicatio with a CTreeCtrl in it . On a right click event I need to get the position of the mouse so that i can show another dialog at that location .
What method do I need to call ?
|
|
|
|
|
GetCursorPos() returns the position of the mouse, then use ScreenToClient() to translate it.
Roger Allen
Sonork 100.10016
I think I need a new quote, I am on the prowl, so look out for a soft cute furry looking animal, which is really a Hippo in disguise. Its probably me.
|
|
|
|
|
Thank you. that worked . I needed just the GetCursorpositon function .
I couldnt actually get the significance of the screentoClient method. Please can u explain ?
|
|
|
|
|
I am trying to set up an 2D array using COleSafeArray but I get an error ("INVALID INDEX) when I set the index to include negative values.
In short, I want an array with -10
|
|
|
|
|
You need to give index[1] some value, i.e., initialize the array. In the way you are using it the position 1 of the index has nothing in it. if you add something like
index[1] = 0;
before your for loop your code should work.
|
|
|
|
|
I derived a class from CButton, let's call it My_Button for the sake of discussion. Then I derived another class from My_Button, call it My_Button1. I thought I could create message handlers in My_Button that would handle common actions for all my button classes, but for some reason, My_Button (my base class) doesn't respond to the messages. Here's what happens... If I create a message handler (OnMouseMove) in the My_Button class, it won't capture mouse movement, but if I add that handler in the My_Button1 class, it does! Am I missing something? Shouldn't my new base class also handle it?
Thanks.
|
|
|
|
|
Check the BEGIN_MESSAGE_MAP macros in .cpp files. Probably Your_Button1 goes straight to CButton (not to Your_Button) when handling Windows messages - it has CButton as 2nd macro argument and should have Your_Button.
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
Thanks, that did the trick. Guess you can tell I'm new at this. Seemed obvious once you provided the answer. Of course, doesn't it always?
Thanks again for the speedy reply.
|
|
|
|
|
Hi,
Can anyone explain the following problem, to do with CArray and CPtrArray?
My member variables are:
CArray<CMyClass,CMyClass> m_objects;
CPtrArray m_pointers;
I try to initialize them like this:
for(int i = 0; i < 5; i++){
m_objects.Add(CMyClass());
m_objects[i].m_nMember = i;
m_pointers.Add((void*) &m_objects[i]);
}
In my paint function, I just loop through the pointers, cast them and output the value of m_nMember. Like this:
for(int i = 0; i < m_pointers.GetSize(); i++){
int value = ((CMyClass*) m_pointers.GetAt(i))->m_nMember;
//draw value to the screen
}
I'd expect the output to be: 0 1 2 3 4, but it's not; 1 to 4 are always correct, but the first value is always nonsensical.
I was able to solve the problem by using a different initialization:
for(int i = 0; i < 5; i++){
m_objects.Add(CMyClass());
m_objects[i].m_nMember = i;
}
m_pointers.SetSize(m_objects.GetSize());
for(i = 0; i < m_objects.GetSize(); i++){
m_pointers.SetAt(i, (void*) &m_objects[i]);
}
But still I would like to understand why the first approach doesn't work. Anyone have a clue? Is it a bug or something?
Thanks,
Tom
|
|
|
|
|
The CArray is a dynamic array. If you add data to it and the currently allocated memory is already full, the storage is reallocated and the data are copied to the new memory (using copy constructors for classes).
Because you have not specified the length of the array in advance, the initial length was only 1 and the array was reallocated before inserting the second item - so your first pointer points to nowhere => it's wrong to use pointers to container data this way.
Also it is good practice to allocate the array using SetSize(), if you know the required size in advance.
Pavel
Sonork 100.15206
|
|
|
|
|
Can Anyone tell me how to call Stored Procedures of SQL Server in DAO
Samir Sood
|
|
|
|
|
I need to find the mac address of all the machines in the network. I already know the ip address from the DNS table. Can someone tell me how to use the ip address to find its corresponding mac address? Thank you.
|
|
|
|
|
|
You can use the ARP utility.
|
|
|
|
|
HI,
Did you have seen some materials or VC++ source code about
CD image file system: ISO or udf ?
Any information or ideas?
Thanks a lot!
chen
|
|
|
|
|
Did you bother to search codeproject? Maybe this[^] helps
...if you're under 8 or younger. Chris Maunder, the Lounge
|
|
|
|
|
Hello ,everyone,
I want to simulate an animal's movement on a specified terrain.
According to the terrain's changement,I can also change the
animal's moving direction and velocity.
Besides,the animal behaves in random on the rerrain.
In the first step.we can just take the animal as one point.
Anyone has any good idea or code example for me?
thanks a lot.
wang
|
|
|
|