LINUX.ORG.RU

Ответ на: комментарий от andalevor

Посредственная книжка, читал ее. Вообще, в современном С нет ничего такого, что потребовало бы новых книг. К&Р хватит всем. А новшества вроде маллока на стеке лучше не использовать... Да и от дженериков фактически смысла нет.

Eddy_Em ☆☆☆☆☆ ()

электронные книги по ... C2x

Ну, начни отсюда, хе-хе.

anonymous ()
Ответ на: комментарий от andalevor

лучше уж про многопоточность встроенную кстати как там поддержка компиляторов уже доросла?

Вольдемар

anonymous ()
Ответ на: комментарий от Eddy_Em

Я тут одну тему поднимал. На сколько я понял, без restrict надо быть знатоком компилятора, чтобы помочь ему оптимизировать код. Мне кажется, что restrict всё-таки нужен.

andalevor ★★ ()
Ответ на: комментарий от Eddy_Em

С одним malloc не получится делать что-то вроде:

double (*cube)[y][z] = malloc(x * y * z * sizeof(double));
cube[1][2][3] = 2.0;

Придётся писать:

double *cube = malloc(x * y * z * sizeof(double));
cube[1*y*z + 2*z + z] = 2.0

Что менее очевидно и подвержено ошибкам (я совсем не уверен, что написал правильно).

andalevor ★★ ()
Ответ на: комментарий от Eddy_Em

UB будет, если программист сам напишет restrict и сам же подаст на вход такой функции 2 указателя на одну память. Это не «пустое место» это злонамеренный выстрел себе в ногу. Вот если бы restrict был дефолтом, как в фортране, тогда бы я с вами согласился.

andalevor ★★ ()
Ответ на: комментарий от andalevor

Многомерные массивы не нужны особо, но при желании и их пачкой маллоков можно сделать.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Баг заключался в передачи memcpy 2х указателей на одну память? Получается, программист, который этот баг допустил не был в курсе С99 и restrict в частности, но использовал его. Было б хорошо, чтобы язык ограждал программиста от излишних сложностей и такие языки есть(правда за такую защиту приходится платить), но С задумывался авторами другим языком. Языком, где программисту даны большие возможности, а с ними и большая ответственность. Кому это не надо – могу писать на таких замечательных языках как java или python. На сколько мне известно, там UB нет.

andalevor ★★ ()

Знаю небесплатную: «Ben Klemens — 21st Century C: C Tips from the New School».

Это не самостоятельный учебник, но скорее подробный обзор языка для устранения пробелов между K&R и актуальным стандартом.

anonymous ()
Ответ на: комментарий от anonymous

устранения пробелов между K&R и актуальным стандартом.

Смысл изучать актуальный стандарт, если его никто не придерживается.

anonymous ()
Ответ на: комментарий от anonymous

Я пишу как мне удобно, gnu11 со всеми нестандартными расширениями, потому что мне так нравится. Но на практике все пишут либо c89 либо (реже) c99 и если код чужой, тебе придётся придерживаться. У msvc опять же проблемы будут если не позаботиться об этом заранее.

anonymous ()
Ответ на: комментарий от anonymous

Ну гцц есть, это стандарт. Он много чего поддерживает из актуального. Если чего-то в нём нет, то нет. Разработчики конечно сказали поддержка тех же тредов это проблемы глибц, но так ли они нужны? Жили ведь как-то с pthread.

anonymous ()
Ответ на: комментарий от vvviperrr

designated initializers

Вообще-то, это С99! Я ими пользуюсь иногда, очень удобно. Чаще - для частичного заполнения полей структур.

compound literals

Этим не пользуюсь. Но тоже вполне вменяемая штука.

Я против С99 ничего не имею, сам в нем собственно и пишу!

Eddy_Em ☆☆☆☆☆ ()

Читаю драфты, там же не особо много текста.

Deleted ()
Ответ на: комментарий от Deleted
#include <stdlib.h>
#include <stdio.h>

#define A 100
#define B 100

int main(int argc, char **argv) {	
	int (*arr)[A][B] = calloc(A * B, sizeof(int));
	
	for(int i = 0;i < A;i++)
		for(int j = 0;j < B;j++)
			(*arr)[i][j] = i * j;
	
	for(int i = 0;i < 10;i++)
		for(int j = 0;j < 10;j++)
			printf(j == 9 ? "%2d\n" : "%2d ", (*arr)[i][j]);
		
	
	return 0;
}

 0  0  0  0  0  0  0  0  0  0 
 0  1  2  3  4  5  6  7  8  9 
 0  2  4  6  8 10 12 14 16 18 
 0  3  6  9 12 15 18 21 24 27 
 0  4  8 12 16 20 24 28 32 36 
 0  5 10 15 20 25 30 35 40 45 
 0  6 12 18 24 30 36 42 48 54 
 0  7 14 21 28 35 42 49 56 63 
 0  8 16 24 32 40 48 56 64 72 
 0  9 18 27 36 45 54 63 72 81 
Deleted ()
Ответ на: комментарий от Eddy_Em

Ну ты даешь, restrict же можно и не использовать, а можно использовать и получать профиты! Ты прям как растер «давайте уберем возможности, и тогда никто не будет стрелять в ногу!».

Deleted ()
Ответ на: комментарий от anonymous

Да ненужны они, там что то виндузятское ограниченное.

Deleted ()
Ответ на: комментарий от Deleted

Атомики?

Честные? Иногда нужны. Но я сомневаюсь что-то в их честности.

restrict же можно и не использовать

Кому надо, пусть и использует. Мне лично это кажется чрезмерным усложнением языка. А ведь С и хорош был своей простотой. Из него же пытаются какого-то говномонстра сделать вроде крестов!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Просто си нужно как-то конкурировать с фортраном. До сих пор сливает ему по всем параметрам.

anonymous ()
Ответ на: комментарий от Deleted

К сожалению, это правда. Прикладной код писать не очень удобно, но он более эффективный в плане вычислений по умолчанию (из того что я видел).

anonymous ()
Ответ на: комментарий от Deleted

Я видел как как использование слова register ускоряло цикл раз эдак в 10000. А вы говорите подсказки бесполезны.

anonymous ()
Ответ на: комментарий от anonymous

Из за чего он более эффективный? Это вообще высокоуровневый язычек, а С все же низкоуровневый, и для оптимизации у него возможностей больше, интриски там всякие, низкоуровневые штучки. Где сейчас Fortran вообще используется? Он же как COBOL, древность нинужная. Церн на плюсы давно перешел к примеру...

Deleted ()
Ответ на: комментарий от anonymous

А бесконечный цикл за сколько выполнялся? %)

Deleted ()
Ответ на: комментарий от anonymous

Я видел как как использование слова register ускоряло цикл раз эдак в 10000. А вы говорите подсказки бесполезны.

С -O0 собирали?

anonymous ()
Ответ на: комментарий от anonymous

Нет, -O3 -ffast-math -funroll-loops и всё остальное было перепробовано, в том и дело. Компилятор производил производительный код только с прогоном pgo, так и выяснилось.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.