|
Possibly, but probably not. The size() method is an inline method that simply returns the value of a member variable, so if your compiler optimises correctly it should boil down to a simple comparison with a indirect-indexed value, just the same as if it was a local variable you were comparing against. However, it's probably a good idea to store the size locally anyway, just in case the compiler doesn't optimise it for some reason, and to make it more obvious to humans that you want the code to run as fast as possible.
Obviously, if the size of the vector changes inside the loop, then you'll have to either call size() each time or update your local variable every time you do something that changes the size of the vector (add, delete etc...)
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Why not create two small functions and test it? Remember to run in release-mode.
|
|
|
|
|
I would compare the assembly when compiled in release mode.
Ant.
I'm hard, yet soft. I'm coloured, yet clear. I'm fuity and sweet. I'm jelly, what am I? Muse on it further, I shall return! - David Williams (Little Britain)
|
|
|
|
|
I would just time the results - if the differences were not big enough to make a mark in - say - 10 000 iterations, I wouldn't even bother optimize it
|
|
|
|
|
Fair point. Most times optimization of such loops is wasted effort IMO.
Ant.
I'm hard, yet soft. I'm coloured, yet clear. I'm fuity and sweet. I'm jelly, what am I? Muse on it further, I shall return! - David Williams (Little Britain)
|
|
|
|
|
Your question implies that you are doing,
for (int ii = 0; ii < a_vector.size (); ++ii )
{
a_vector [ ii ].DoSomething () ;
}
You may find that operator [] on vector is more expensive than size. Especially given that in many cases an interator resolves to a plain old pointer, so both the dereference and the increment are cheap.
Perhaps you could measure your way and also,
A_VECTOR::iterator it ;
A_VECTOR::iterator itE = a_vector.end () ;
for ( it = a_vector.begin () ; it != itE; ++it )
{
(*it).DoSomething () ;
}
But it's cleanest by far to write,
class A_TYPE { ... } ;
vector<A_TYPE> a_vector ;
for_each ( a_vector.begin (), a_vector.end (), mem_fun_ref ( &A_TYPE::DoSomething )) ;
or some variant of function, functor etc that suits your code. I think this is probably potentially the fastest since the compiler has all the information to inline everything.
Paul
|
|
|
|
|
C++ in "Hardware structures" stand point question: Does the ALU handle any floading points operations? or will the processor let the FPU handles them?
I mean, any floading point operation, both simple and complex ones.
Thanks.
|
|
|
|
|
If the CPU has an FPU, then the FPU will handle all floating-point operations, as long as the compiler uses the correct instructions. If it emulates floating point in software, then the FPU will not be used. Also, if the FPU doesn't support a certain operation, it will have to be emulated in software (which, incidentally, will probably use other FPU instructions).
There are very few cases when a CPU's main ALU actually handles floating-point operations - floating-point DSP processors are the only ones I can think of.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I have a property page that is used multiple times in a wizard with slight variations each time. Therefore for each instance of the page I want to show/not show various controls. How do I do that? I thought I could just make a control variable and then do something like m_nListBox1.SetVisible or something or other. How do I dynamically make controls visible and invisible? I am missing something obvious and it must be because I got up far too early this morning.
|
|
|
|
|
use CWnd::ShowWindow function to show or hide them.
|
|
|
|
|
Tried this in OnInitDialog and OnSetActive. Causes and assertion both times.
|
|
|
|
|
ShowWindow is THE API to use to show and hide windows, if your window does not exist yet, the function will assert.
Try making sure that the window you are calling this function on is valid before you call this function.
an exmaple of this would be
Page::OnInitDialog();
{
BOOL ret = CPropertyPage::OnInitDialog();
CWnd *pWnd = GetDlgItem(IDC_MY_WINDOW);
if (!pWnd || !::IsWindow(pWnd->GetSafeHwnd())
{
ASSERT(FALSE);
}
else
pWnd->ShowWindow(SW_HIDE); // or whatever you want to do with it.
}
Did you use classwizard to generate control variables for your window objects?
/yawar
|
|
|
|
|
Hi,
I have an over-ridden handler CMyDialog::OnNcLButtonDown() which detects if the user selects the title bar of my dialog. The user then drags the dialog and releases the mouse button. How can my program know when the mouse button has been released? I have tried over-riding the CMyDialog::OnNcLButtonDown() function but it does not work.
|
|
|
|
|
Anonymous wrote:
I have tried over-riding the CMyDialog::OnNcLButtonDown() function but it does not work.
Sorry. I mean to say the CMyDialog::OnNcLButtonUp() function
|
|
|
|
|
try overloading WM_NCHITTEST message, the code will look something like this
UINT YourClass::OnNcHitTest(CPoint point) <br />
{ <br />
int ret = YourParentCwndBasedClass::OnNcHitTest(point);<br />
if (ret == HTCAPTION)<br />
{<br />
if (GetAsyncKeyState(VK_LBUTTON) < 0)<br />
{<br />
if (!mbLButtonDown)<br />
{<br />
TRACE("\nDown");<br />
mbLButtonDown = true;<br />
}<br />
}<br />
else<br />
{<br />
if (mbLButtonDown)<br />
{<br />
TRACE("\nUp");<br />
mbLButtonDown = false;<br />
}<br />
}<br />
}<br />
return ret;<br />
}
where mbLButtonDown would be a bool member of your class and would need to be initialized as false when constructing your window.
There might be some other way to do this too, this was just a quick thing that came to my mind.
HTH,
/yawar
|
|
|
|
|
I said "try overloading".. that was not right, I meant "try writing message handler for"...
|
|
|
|
|
Another way to detect the end of a move by dragging the caption bar is to simply handle WM_MOVE and check if the mouse is over the window's caption bar. You can do this by calling GetCursorPos() and checking if the point lies within the caption bar. GetWindowRect() and GetSystemMetrics() can help you in your computation.
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
How do you form the filepath string to indicate you want to save a file to the desktop?
I know "C:\\FOLDER\\FILE.TXT"
but what is the path to the desktop?
A client asked me to make a simple change to a downloadable web installer tool I wrote. It used to have a File...Save As dialog and they wanted me to change it to automatically save to the dektop. No problem! I said I'd do it for free. Delete the common dialog code, change the CFile.SetFilePath code from CCommonDialog.GetPathName to............ what? What is that magical cobination of ascii characters that tells my app to save to the desktop?
TIA!
//placeholder for witty verbiage
|
|
|
|
|
use ::SHGetSpecialFolderLocation or SHGetSpecialFolderPath function. with folder parameter as CSIDL_COMMON_DESKTOPDIRECTORY (for all users) or as CSIDL_DESKTOP (for currently logged in user).
Functions are declared in Shlobj.h
/yawar
|
|
|
|
|
Fantastic Yawar!
I googled, I searched but I never would have thought to look there
This did the trick. Thanks.
//placeholder for witty verbiage
|
|
|
|
|
SHGetSpecialFolderLocation()
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
Hi,
I am quite new to Internet Programming.
I am trying to create a program that will load an HTML page from an address i give to him, and fill the edit boxes with values i have in memory (let's say... any constants for now)..
For example, the interface should have just a text box to enter the URL, a fill button, and an area for HTML page to appear in.
When i enter the URL and press enter, the HTML area loads the page with the URL (PROBLEM #1.. dunno how to do this!)
When i press Fill, the text areas get filled by some constant (PROBLEM #2.. dunno how to do this!)
Could you please help? Is there any kind of documentations that will be of help?
Thank you very much for all the help in advance..
|
|
|
|
|
|
Just looking for a little clarification here. We have a third party application that we don't control the codebase to, however we do provide the calculation engines it uses. What I am looking to do is time how long it takes from when someone clicks a button within their application to when the report it creates is subsequently displayed. I thought we could use a Windows Hook but from the bit I have read about them, it requires you to have a handle to the process loaded in memory, with the examples I have seen they typically have control over this simply by calling LoadLibrary() . I don't want to load another instance of the executable into memory to get a HANDLE to it. Does anyone have any comments to point me in the right direction? Thanks in advance.
- Nick Parker My Blog | My Articles
|
|
|
|
|
>> however we do provide the calculation engines it uses.
So it's a DLL? If so you can change your DLL to get the handle to the current process. Your in.
If they link to your lib staticaly that won't work of course. However you can enject DLL into a process. There are articles on MSDN and maybe even here at CP about doing that.
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|