On Fri, Jan 16, 2009 at 3:34 AM, Mohamed Mansour
<[email protected]> wrote:
> Hi,
> I would need some advice on how to do one static initializer when it is
> contained within the UI Thread. I want to try a simple example
> like: /src/chrome/browser/views/frame/browser_view.cc Can I get a
> confirmation whether what I am doing would be correct, and I have some
> questions that I am a bit confused (ok really confused, I don't want to
> submit a patch that I don't understand):
> This is one of the static initializers in browser_view.cc
>>
>> SkBitmap BrowserView::default_favicon_;
>
> And within the header file (browser_view.h) default_favicon_ is defined
> there as well:
>>
>> static SkBitmap* default_favicon_
>
> My first question, why is that done like that? Why do we have
> default_fav_icon_ defined in the class and header file? And why couldn't we
> just have it defined in the header file as this:
>>
>> SkBitmap* default_fav_icon_

This is how C++ works.  The problem is, you need to know where the
storage goes.  This pointer takes 4 bytes, and it needs to live
somewhere.  Which .o will it live in?  If it was only defined in the
header, there would be no way to really figure out where the storage
belongs.  This is how statics work (and I generally avoid class-level
statics unless really needed).  (There is an exception for static
integers and maybe other primitive types since their value can be
inlined, and needs no storage).

This is why it's also in the .cc, the one is the declaration, the
other is the definition.

>
> And if we want it as static to make it one instance, we could just add
> static at the beginning
> default_favicon_ is only initialized within the function InitClass (which is
> static) where it is being initialized like this:
>>
>> default_favicon_ = *rb.GetBitmapNamed();
>
>
> Since we wanted to ensure a singleton (unless I am mistaken), should we
> check if that variable is already initialized? From what I understand (mind
> you I am very new to c++, and am reading books that were recommended to me)

If it's singled threaded, who else would have initialized it?

>
> I would just delete the field declared in the class:
>>
>> void BrowserView::InitClass()
>
> And define it as a pointer in the header file:
>>
>> static SkBitmap* default_favicon_
>
> And within the init function I check if its valid and if it isn't I set it.
>>
>> if (default_favicon_)
>>   default_favicon_ = *rb.GetBitmapNamed();
>
> I have submitted two patches for remove static initializers but then deleted
> them because I "really" didn't understand what is going on. If anyone could
> shed some light, it would be highly appreciated! I am coming from a Java
> background if that would help.
>
> Thanks! And sorry for this long email.
>
>
> On Tue, Jan 13, 2009 at 12:50 PM, Dmitry Titov <[email protected]> wrote:
>>>
>>> They also contribute to launch time.  Generally speaking, the less
>>> code we have to execute during startup, the better it is for the user
>>> experience.
>>
>> This is especially important, because even though initialization is often
>> trivial, the page with the code for each initializer should be loaded from
>> disk into memory on startup. This paging often constitutes most of the app
>> startup time.
>>
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: [email protected] 
View archives, change email options, or unsubscribe: 
    http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to