missing HexString documentation

Steven Schveighoffer schveiguy at yahoo.com
Tue Feb 13 15:51:14 UTC 2018


On 2/11/18 4:48 PM, Walter Bright wrote:
>> I also notice that hex strings are not simply equivalent to strings 
>> with \x in them -- the latter is more constrained, as it must be a 
>> pair of hex digits per \x. hex strings allow spaces between them.
> 
> The idea was to be able to cut&paste text from things like hex dumps, 
> which include whitespace formatting.

I've never seen a hex dump where the individual nibbles were separated 
by spaces in odd ways.

In other words, what I was saying is that:

"\x12\x34"

could be written as:

x"1 23 4"

which is... odd. What it does is make it so you can't reuse the parsing 
code inside the string escape processor to handle the hex string, 
necessitating an extra 80-line function.

>> I wouldn't call invoking CTFE "no overhead"
> 
> It is no overhead in the generated code.

It's overhead that adds up, memory and time-wise. Really, the memory 
concerns of using CTFE are a bigger problem than the extra tenths of a 
second of compile time.

> 
>> I tested it out, and generating a hex string of about 600 bytes took 
>> 3x as long as using builtin hex strings.
> 
> That's only a potential issue if you've got a very, very large number of 
> hex strings. And if you do, those strings can be put in a separate 
> module and compiled separately.

Or a very large hex string (very feasible). But very true that there are 
mitigating methods that can be used.

>> Well, nobody asked :) Besides, it's still not "fixed", as it has the 
>> same poor performance as the previous version. And the new version has 
>> broken existing code.
> 
> It didn't break code that used x"deadbeef", it broke code that used the 
> broken hexString.

In the past, we have not broken code, even when it depends on known 
bugs, if we can help it. But maybe if we can fix the bug I filed above, 
it won't matter.

>> What the update shows is that you have to jump through incredible 
>> hoops to get the compiler not to include your compile-time only 
>> generation code in the resulting binary.
> 
> With a language that supports both templates and separate compilation, 
> this will always be an issue.

Essentially, you have instantiated the template eagerly, which kind of, 
sort of, defeats the purpose of a template. Though, you still do get the 
benefit of code generation, it's just not an "open-ended" template that 
you can instantiate with any type. Perhaps we should be using this 
pattern all throughout phobos where strings are involved, since there 
are ever only 3 types you instantiate with.

> The solution here is not "incredible", it is just not obvious.

The solution isn't incredible, but the fact that this solution is the 
only way to get the CTFE-only code not to creep into your object file is 
a bit dissatisfying. You would think the linker/compiler would not 
inject the unused function into the object file without having to do this.

>> And nothing has changed here, it's still a library function, as it was 
>> before.
> 
> What's changed is it works now with -betterC, and it doesn't produce 
> bloat in the executable.

I think this is due to functions-that-aren't-used being included.

In other words, there was nothing inherent in the old library code that 
created a requirement for druntime to be included.

The bloat is also a deficiency of the compiler, not the code itself.

>> But if you already have the compiler feature, I don't see why we 
>> should remove it because a slower library version exists.
> 
> It was not an arbitrary and capricious decision, and the rationale 
> behind it was presented here multiple times. If you are not convinced, 
> that's cool, but the "why" should be pretty clear.

I missed the discussion (there are times where I can't pay attention to 
D for a month or so due to being busy). But in any case, sure I 
understand the "why", but the cost/benefit for me was not high enough, 
and in some aspects, it is all cost, no benefit.

In any case, it isn't a decision that needs to be reversed, as there is 
a workable solution in the library, even if it's sub-optimal. I just 
think it's not as beneficial as has been reported.

-Steve


More information about the Digitalmars-d mailing list