[Bf-committers] Re: [Bf-blender-cvs] CVS commit: blender/source/blender/src header_info.c usiblender.c

Ed Halley ed at halley.cc
Tue May 30 15:04:05 CEST 2006

To add to Ton's brief blurb, to explain the diff between python and C...

That's because Python does all of the memory management for you.

In C, you have to do the memory management yourself.  You must give a 
size, either for those bytes allocated within a structure, or the size 
sent to allocator routines like malloc(). When you call free(), it has 
kept an internal record of how big that allocated block was.  There are 
re-allocating systems, but it's usually a little cumbersome to write the 
extra calls required to allocate a bigger block.  And those structure 
definitions can't be changed after the code is compiled.

By convention and with a little support from the compiler, C strings end 
with a zero byte.  To find the current length of such a string, you call 
something like strlen() but that actually requires scanning every byte 
in the string to find that terminator.   Your actual strings can be 
shorter than the memory you allocated for those strings.

A length like "160" was common for a maximum path length in Windows in 
the old days, but not for multi-byte characters and complicated mount 
points and modern fifteen-directory-deep source code trees.  Now you 
should probably allow for path strings that are 1000 bytes or even 
longer.  However, when putting those constraints into fixed structures, 
you're now wasting the unused space.  Better to have a pointer in the 
structure which refers to dynamically allocated memory, and then write 
that dynamic block out when saving the structure to disk (sdna, etc.).

In scripting languages like Python, strings have no particular 
terminating character, so the engine must keep the length internally, 
and adjust it on every operation that changes the string, and does all 
the re-allocation stuff for you when you need more space.  Unlike most 
usages of C, that means that the string length and the allocation length 
are kept in sync.  (As an aside, strings don't end with "\n" characters 
in either language.)

Toni Alatalo wrote:
> On Tuesday 30 May 2006 15:22, Ton Roosendaal wrote:
>>I meant *maximum* space for strings... that's the whole problem you
> (and here a c-ignorant coder wonders why strings must have a defined max 
> length .. is it because how malloc / sdna / something works - i thought they 
> could just end to \n when they feel like it?, but guess that something needs 
> to know the size
> this seems to work ok in python: 
> In [58]: longstr = 'I am a long string - ' * 1000000
> In [59]: len(longstr)
> Out[59]: 21000000
> but that is of course irrelevant and you can just happily ignore me :)
> ~Toni
>>On 30 May, 2006, at 13:38, Jiří Hnídek wrote:
>>>Hi Ton,
>>>why need I store length of string? I can use function strlen(string),
>>>can't I. What should do generic string manipulation library? I guess,
>>>I could write one.
>>>Ton Roosendaal wrote:
>>>>>I'm just rewriting recent open as ListBase and I would like to
>>>>>replace sce[160], lib[160], ima[160] with pointers at char in the
>>>>>future too.
>>>>A nice generic string manipulation lib would help too :)
>>>>Using our secured malloc, any malloc can always be verified to return
>>>>the data allocation size, with this call;
>>>>So you don't need to store string lengths.
>>>Bf-committers mailing list
>>>Bf-committers at projects.blender.org
>>Ton Roosendaal  Blender Foundation ton at blender.org
>>Bf-committers mailing list
>>Bf-committers at projects.blender.org
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-committers

[ e d @ h a l l e y . c c ]

More information about the Bf-committers mailing list