首页
学习
活动
专区
工具
TVP
发布

开发 & 算法杂谈

专栏作者
66
文章
91020
阅读量
36
订阅数
Spring 面试题
大多数你可能被问到的问题都列举在下面的列表中了。所有的核心模块,从基础的Spring功能(如Spring Beans)到上层的Spring MVC框架,文章中都会进行简短的讲解。看完这些面试问题,你应该看看我们的Spring教程。
chain
2019-05-26
7530
UML之用例图
UML-Unified Model Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。 在UML系统开发中有三个主要的模型:   功能模型: 从用户的角度展示系统的功能,包括用例图。   对象模型: 采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类图、对象图、包图。   动态模型: 展现系统的内部行为。 包括序列图,活动图,状态图。
chain
2019-05-26
1K0
C语言:内存字节对齐详解[转载]
一、什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。 二、对齐的实现 通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。 但是,正因为我们一般不需要关心这个问题,所以因为编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,出乎意料。为此,我们需要对对齐算法所了解。 对齐的算法: 由于各个平台和编译器的不同,现以本人使用的gcc version 3.2.2编译器(32位x86平台)为例子,来讨论编译器对struct数据结构中的各成员如何进行对齐的。 设结构体如下定义: struct A { int a; char b; short c; }; 结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个。所以A用到的空间应该是7字节。但是因为编译器要对数据成员在空间上进行对齐。 所以使用sizeof(strcut A)值为8。 现在把该结构体调整成员变量的顺序。 struct B { char b; int a; short c; }; 这时候同样是总共7个字节的变量,但是sizeof(struct B)的值却是12。 下面我们使用预编译指令#pragma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。 #progma pack (2) /*指定按2字节对齐*/ struct C { char b; int a; short c; }; #progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct C)值是8。 修改对齐值为1: #progma pack (1) /*指定按1字节对齐*/ struct D { char b; int a; short c; }; #progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct D)值为7。 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。 这里面有四个概念值: 1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。 2)指定对齐值:#pragma pack (value)时的指定对齐值value。 3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。 有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是 数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍,结合下面例子理解)。这样就不难理解上面的几个例子的值了。 例子分析: 分析例子B; struct B { char b; int a; short c; }; 假设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指 定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为 4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空
chain
2019-05-26
2.7K0
Redis基础数据结构小结
最近在回顾Redis相关的一些基础知识,结合网上博客的一些分享,整理了一下思维导图,分享给有需要的同学~
chain
2018-08-28
3370
Django-Database 之 Many-To-Many关系
这里对Many-To-Many即多对多的映射关系以详细事例来分析Django中Database操作多对多映射关系的一些基本用法和注意事项
chain
2018-08-02
6020
Coderbyte-Challenger之Letter Capitalize(单词字母大写)
Have the function LetterCapitalize(str) take the str parameter being passed and capitalize the first letter of each word. Words will be separated by only one space. 
chain
2018-08-02
7060
PAT Advanced 1005
Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.
chain
2018-08-02
2670
也谈应用程序级的同步、异步、阻塞、非阻塞
这几个经常出现的词汇很容易会引起大家的误解,第一次接触相关词汇是在课上,当时上操作系统的老师说得比较模糊(阻塞==同步,非阻塞==异步),当时觉得挺对 的,
chain
2018-08-02
9730
PAT Advanced 1066
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
chain
2018-08-02
2110
PAT Advanced 1067
1067. Sort with Swap(0,*) (25) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY oper
chain
2018-08-02
2460
PAT Advanced 1042
Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid "inside jobs" where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.
chain
2018-08-02
2370
PAT Advanced 1043
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
chain
2018-08-02
2360
PAT Advanced 1001
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
chain
2018-08-02
2940
PAT Basic 1010
#include <stdio.h> int main() { int n, e, flag = 0; while (scanf("%d%d", &n, &e) != EOF) { if( n*e ) { if(flag) printf(" "); else flag = 1;
chain
2018-08-02
4980
PAT Basic 1009
#include<stdio.h> #include<string.h> /*此题和1008类似*/ void reverse(char *a,int left,int right) { while(left<right) { char temp=a[left]; a[left]=a[right]; a[right]=temp; left++;right--; } } int main() { char a[81]; gets(a); reverse(a,0,strlen(a)
chain
2018-08-02
3240
PAT Basic 1008
#include<stdio.h> #include<stdlib.h> /*三次逆置*/ void reverse(int *a,int left,int right) { while(left<right) { int temp=a[left]; a[left]=a[right]; a[right]=temp; left++;right--; } } int main() { int n,k,i; scanf("%d %d",&n,&k); int *a=(int *)m
chain
2018-08-02
4420
PAT Basic 1007
#include<stdio.h> #include<math.h> int a[100000]={0}; int main() { int n,i,j,flag,count=0; scanf("%d",&n); a[2]=a[3]=1; for(i=5;i<=n;i=i+2) { flag=1; for(j=3;j<=sqrt(i);j++) { if(a[j]==1) if(i%j==0) flag=0; } a[i]=flag; } i=3;
chain
2018-08-02
5180
PAT Basic 1006
#include<stdio.h> /*简单的模拟题*/ int main() { int n,a[3]={0},count=2,i; scanf("%d",&n); while(n/10 != 0) { a[count--]=n%10; n=n/10; } a[count]=n%10; if(a[0]!=0) for(i=0;i<a[0];i++) printf("%c",'B'); if(a[1]!=0) for(i=0;i<a[1];i++) printf(
chain
2018-08-02
5380
PAT Basic 1005
#include<stdio.h> #include<stdlib.h> int b[101]={0}; int main() { int n,i,temp,count=0,j,temp2; scanf("%d",&n); int *a=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) scanf("%d",&a[i]); /*sort*/ for(i=0;i<n;i++) { int min=i; for(j=i;j<n;j++) {
chain
2018-08-02
9330
PAT Basic 1002
#include<stdio.h> char a[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; /*递归的从左至右输出各个位*/ void b(int sum,int count) { count++; if(sum/10 !=0 ) b(sum/10,count); if(count==1) printf("%s",a[sum%10]); else printf("%s ",a[sum%10]); }
chain
2018-08-02
6450
点击加载更多
社区活动
Python精品学习库
代码在线跑,知识轻松学
热点技术征文第五期
新风口Sora来袭,普通人该如何把握机会?
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·干货材料·成员作品·最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档