> On Feb 20, 2023, at 10:17 AM, Jakub Jelinek <ja...@redhat.com> wrote: > > On Mon, Feb 20, 2023 at 03:04:51PM +0000, Qing Zhao via Gcc-patches wrote: >> >> >>> On Feb 17, 2023, at 5:35 PM, Jakub Jelinek <ja...@redhat.com> wrote: >>> >>> On Fri, Feb 17, 2023 at 10:26:03PM +0000, Qing Zhao via Gcc-patches wrote: >>>> + else if (!DECL_NAME (lhs_var)) >>>> + { >>>> + char *lhs_var_name_str >>>> + = xasprintf ("D.%u", DECL_UID (lhs_var)); >>> >>> Why xasprintf? >> >> Just emulated the code in “gimple_add_init_for_auto_var” without thinking >> too much. -:) >>> D.%u can be sprintfed into a fixed size automatic buffer, >>> say 3 + (HOST_BITS_PER_INT + 2) / 3 would be a good upper bound for the size >>> of the buffer. Then you don't need to free it... >> >> xasprintf is "like a sprintf but provided a pointer to malloc’d storage >> (without fail)”. If free the pointer properly, then it should be okay, right? >> In addition to “no need to free”, what other benefit to use sprintf other >> than xasprintf? > > xasprintf+free being significantly slower, exactly because it needs to > malloc and free later, where both are fairly expensive functions. > The glibc asprintf for short strings like the above uses a ~ 200 byte > static buffer, stores in there, later mallocs the needed amount of memory > and copies it there (so again, another waste because the string needs to be > copied around), while for longer it can do perhaps many allocations and > realloc at the end to the right size. > The libiberty function actually performs the printing twice, once without > writing result anywhere to compute size, then malloc, then again into the > malloced buffer.
Okay, thanks a lot for the info. I will replace xasprintf with sprintf for this patch. Qing > > Jakub >