this post was submitted on 29 Dec 2024
346 points (100.0% liked)

Programmer Humor

22113 readers
664 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
 
top 40 comments
sorted by: hot top controversial new old
[–] [email protected] 95 points 3 months ago (2 children)

the :================D operator

[–] [email protected] 22 points 3 months ago
[–] [email protected] 6 points 3 months ago

New language idea:

:====D
:==========D 0
:=======0==D~~~
:==========D ~0
[–] [email protected] 84 points 3 months ago

I'm not sure if this is serious or not and that scares me.

[–] [email protected] 49 points 3 months ago* (last edited 3 months ago)

Rest of the world: We're deprecating C++ due to lack of memory safety. Please consider doing something for safety.

C++ commite: Here's a new convenient operator to make it easier to do a potentially unsafe, multi-level pointer dereference.

[–] [email protected] 25 points 3 months ago

note that the -- -> operator is different than --->

[–] [email protected] 18 points 3 months ago (1 children)
[–] [email protected] 5 points 3 months ago (1 children)
[–] [email protected] 1 points 3 months ago

I really hope so but they first need a language specification. Without that it's no use for me.

[–] [email protected] 14 points 3 months ago

Please don't give them ideas

[–] [email protected] 13 points 3 months ago

C++ is a joke.

[–] [email protected] 13 points 3 months ago (1 children)

I pray for this to be real because it's the perfect syntactic sugar for C++. The kind that you'd think makes sense if you didn't have to write C++ for anything more complex than a high school project.

[–] [email protected] 5 points 3 months ago

Right? Every C++ feature needs to be lightly cursed.

[–] [email protected] 13 points 3 months ago (7 children)

Why do you even have pointers to pointers?

[–] [email protected] 44 points 3 months ago (1 children)

many reasons, for example

  • multidimensional arrays
  • arrays of function pointers
  • pass by reference of a pointer
[–] [email protected] 6 points 3 months ago* (last edited 3 months ago) (1 children)

In two of your cases this operator is pretty shit because at some point you'll probably want to offset the access (this isn't a knock at you but at the feature).

This operator would only really be relevant to the last case which rarely comes up outside of infrastructure/library work (building a tool building tool) and usually those code bases are cautious to adopt new features too quickly anyways for portability.

I've done serious C++ work (not much in the past decade though) - while references are absolutely amazing and you essentially want to pass by const ref by default I think well written maintainable C++ should maybe have a dozen heap objects tops. C++ is a better language if you generally forget that pointers and bare arrays exist.

Just again - I think you're right and the fact that your list is only three things long (and arguably two of them would be misuses) is a pretty clear sign that this is an incredibly niche feature.

[–] [email protected] 16 points 3 months ago* (last edited 3 months ago) (1 children)

I don't think this operator is a real feature, tbh 😅

[–] [email protected] 6 points 3 months ago

The fact that he claims it's in C++ 29, while we are in 2024 is a good hint.

Or maybe he is a time traveler. Quick, go ask the next lottery numbers!

[–] [email protected] 21 points 3 months ago* (last edited 3 months ago) (1 children)

Mostly because at the lowest level of computing (machine code and CPU instructions), pointers are the only method (that I know of) of any kind of indirection.

At the lowest level, there are 2 types of references:

  • CPU registers
  • memory addresses (pointers)

Every higher level language feature for memory management (references, objects, safe pointers, garbage collection, etc) is just an abstraction over raw pointers

Pointers themselves are really just abstractions over raw integers, whose sole purpose is to index into RAM

With that in mind, pointers to pointers are a natural consequence of any kind of nested object hierarchy (linked lists, trees, objects with references to other objects, etc)


The only other kind of indirection would be self-modifying machine code (like a Wheeler Jump). But the computing world at large has nixed that idea for a multitude of reasons

[–] [email protected] 2 points 3 months ago (1 children)

linked lists, trees, objects with references to other objects

That’s not a pointer to another pointer, but a pointer to a data structure that happens to contain another pointer.

[–] [email protected] 16 points 3 months ago* (last edited 3 months ago) (2 children)

The distinction is meaningless in the land of Opcode's and memory addresses

For example, a struct is just an imaginary "overlay" on top of a contiguous section of memory

Say you have a struct

struct Thing {
  int a;
  int b;
  Thing* child;
}

Thing foo {}

You could easily get a reference to foo->child->b by doing pointer arithmetic

*((*((*foo) + size(int)*2)) +size(int))

(I've not used C much so I've probably got the syntax wrong)

[–] [email protected] 1 points 3 months ago (1 children)

Yes, you can do crazy shit if you try hard enough, but every reasonable programmer would access foo->child->b als foo->child->b and not via that crazy LISPy expression.

By question was: Why would you have a pointer to a memory address that itself only holds a pointer somewhere else?

So far the only reasonable explanation is from @[email protected]:

  • arrays of function pointers
  • pass by reference of a pointer
[–] [email protected] 1 points 3 months ago

I'm more talking about theory than practical.

I've not developed anything in C/C++, so I don't know practical uses for a double pointer, aside from multidimensional arrays, or arrays of pointers

My point was that, conceptually, pointers to pointers is how most complex data structures work. Even if the C representation of said code doesn't have a int** somewhere

[–] [email protected] 1 points 3 months ago

Magic.

Blasphemy.

[–] [email protected] 18 points 3 months ago* (last edited 3 months ago) (1 children)

Because stuff can own other stuff and be owned at the same time. Also, arcane jackarsery.

Edit: if you want to give a function a pointer that it may change this may occur in a constructive way. I.e. replace an owned object.

[–] [email protected] 5 points 3 months ago (1 children)

Yeah... But it's usually a good practice to put a struct somewhere between your 30 levels of ownership.

Exceptions exist, but they are not very common. Also, in C++, operators overloading may help you if you keep needing to write code like this.

[–] [email protected] 3 points 3 months ago (1 children)

In C++ you should never have owning raw pointers. Unless you have a good reason™.

Raw pointers are great, but not for ownership.

[–] [email protected] 6 points 3 months ago* (last edited 3 months ago) (1 children)

I just use unique_ptr 99% of the time

[–] [email protected] 4 points 3 months ago

And you should.

It even works for classes whose constructors your implementation cannot see, if you aren't a bitch about it.

[–] [email protected] 14 points 3 months ago

Pointers just point to memory addresses, and because pointers are stored in memory addresses, it just kind of naturally falls out that way.

[–] [email protected] 11 points 3 months ago

Pointer to pointer is fairly common stuff once you get serious with C++ but I've no idea what this abomination is supposed to even be, haha!

[–] Klnsfw 5 points 3 months ago

Because int main(int argc, char** argv)

[–] [email protected] 3 points 3 months ago (1 children)
[–] [email protected] 1 points 3 months ago (1 children)

That’s the best thing I’ve read in a while, and I’m only on page 2!

[–] [email protected] 2 points 3 months ago (1 children)
[–] [email protected] 2 points 3 months ago

If the Mossad wants your data, they’re going to use a drone to replace your cellphone with a piece of uranium that’s shaped like a cellphone

That reads differently after 2024.

[–] [email protected] 11 points 3 months ago
[–] [email protected] 4 points 3 months ago (1 children)

New feature with terrible syntax. There are features of every language I choose not to use. As a C++ developer, I would choose not to use this syntax, so that my team can write better designed code. However, I am an oddball on my team for loving trailing return types. In peer review, the schlong operator i.e. ---> would only be used where it makes sense which should be nowhere.

Peer reviewing this seriously would require knowing more context. Instinct tells me MyClass**** is probably allocated from the heap. A possible reason for so many levels of indirection are jagged arrays. Maybe the function only gets the first element of each level of the arrays. The function name doesn't make that clear. This is poorly designed. Please re-design/re-write. I will happily review those changes. I expect unit tests to show example use cases.

I would suggest using a stack allocated array with sentinels for missing values to improve cache coherency. Without context, I assume looping over the jagged structure will be common. Loading more into cache should improve efficiency in loops, but benchmarks are required.

Wait... I should join the crowd. So I say, "down with C++" and up with some safe alternative. Maybe rust: https://github.com/Speykious/cve-rs.

[–] [email protected] 1 points 3 months ago

Best i can imagine, this is what happens if you are terrified of smart pointers, but also want to make all object pointers scope specific. So at every layer of hierarchy, you have a unique reference to some partial implementation above and below it.

Honestly I struggle to imagine any real scenario where this would make sense... except maybe like some kind of insane recursive factory.

[–] [email protected] 2 points 2 months ago